Tags: | Categories: Silverlight Posted by Christoph on 3/3/2010 10:51 AM | Comments (0)
Ich habe in einem Projekt das Problem, dass Elemente per Drag and Drop von einer Liste in eine andere Liste verschoben werden sollen, ich aber in der Zielliste nicht alle Quellelemente erlaiben will. Das könnte im XAML also so aussehen: <UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:msWindows="clr-namespace:Microsoft.Windows;assembly=System.Windows.Controls.Toolkit" xmlns:controlsToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit" x:Class="DragAndDrop.MainPage" mc:Ignorable="d" d:DesignWidth="467" d:DesignHeight="225" Background="#FFDEDEDE" BorderBrush="#FFEA4747" BorderThickness="1" FontSize="18" > <Grid x:Name="LayoutRoot" Background="White"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <controlsToolkit:ListBoxDragDropTarget HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" x:Name="DragSource"> <ListBox x:Name="lbSource" DisplayMemberPath="Name" /> </controlsToolkit:ListBoxDragDropTarget> <controlsToolkit:ListBoxDragDropTarget Grid.Column="1" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" x:Name="DragDest" msWindows:DragDrop.AllowDrop="true"> <ListBox x:Name="lbDest" DisplayMemberPath="Name" /> </controlsToolkit:ListBoxDragDropTarget> </Grid> </UserControl> und hier ist der passende Codebehind für den DragOver event, der die Elemente prüft: Imports Microsoft.Windows Imports System.Collections.ObjectModel Partial Public Class MainPage Inherits UserControl Public Sub New() InitializeComponent() Dim Persons As New List(Of Person) Persons.Add(New Person With {.Name = "Hans Meiser", .IsAllowed = False}) Persons.Add(New Person With {.Name = "Günther Jauch", .IsAllowed = False}) Persons.Add(New Person With {.Name = "James Brown", .IsAllowed = True}) Persons.Add(New Person With {.Name = "Elvis", .IsAllowed = True}) Persons.Add(New Person With {.Name = "Marianne und Michael", .IsAllowed = False}) lbSource.ItemsSource = Persons DragDest.AllowedSourceEffects = DragDropEffects.Copy End Sub Private Sub DragDest_DragOver(ByVal sender As Object, _ ByVal e As Microsoft.Windows.DragEventArgs) _ Handles DragDest.DragOver '--ignore Sort Events If e.Effects = 3 Then Return '--Fetch Selection Dim Args As ItemDragEventArgs = e.Data.GetData(e.Data.GetFormats()(0)) Dim Sel As SelectionCollection = Args.Data '--Build Persons from Selection Dim Persons = (From Pe In Sel Select DirectCast(Pe.Item, Person)).ToList '--Handle Drag Event If (From P In Persons Where Not P.IsAllowed).Count > 0 Then e.Handled = True e.Effects = DragDropEffects.None End If End Sub End Class Mehr dazu gibt’s bei stackoverflow.com oder direkt hier
Tags: | Categories: Silverlight Posted by Christoph on 1/18/2010 12:56 PM | Comments (0)
Ich hatte das Problem, dass ein Control (welches natürlich wieder in anderen Controls liegt) und das per Code erzeugt wird, eine nicht statische Methode an der Page aufrufen soll. Daher brauche ich natürlich irgendwie die aktuelle Instanz der Page. Das geht in dem Control so: DirectCast(App.Current.RootVisual, Page).MethodToCall()
Tags: | Categories: Silverlight, VB.Net Posted by Christoph on 1/15/2010 10:58 AM | Comments (0)
in einem Silverlight Projekt hatten wir die Notwendigkeit, eine Textbox zu benutzen, die nur die Eingabe einer Fliesskommazahl (in dem Fall eines Währungwertes) zu erlauben. Da wir nicht dringend eine externe Komponente einsetzen wolllten habe ich das Problem mit folgendem Code gelösst: Dabei wird im New-Event des Controls ein KeyDown-Event an die Textbox gebunden, der bei jesem Tastendruck überprüft, ob es ein für eine Fliesskommazahl gültiges Zeichen ist. Leider ist das “,” nicht in der Key Enumeration, und muss händisch über den KeyCode abgehandelt werden. Dabei ist zu beachten, dass das “,” in 3 Varianten abgefragt werden muss: normales “,”, Zehnertastatus und auf dem Mac gibts (wie sollte es anders sein) einen anderen Zahlencode für das “,”. und hier der Codesnippet: Public Sub New() InitializeComponent() AddHandler tbTbx.KeyDown, AddressOf OnlyNumbers End Sub Public Sub OnlyNumbers(ByVal sender As Object, ByVal e As KeyEventArgs) Select Case e.Key Case Key.Tab Return Case Key.D0 Case Key.D1 Case Key.D2 Case Key.D3 Case Key.D4 Case Key.D5 Case Key.D6 Case Key.D7 Case Key.D8 Case Key.D9 Case Key.NumPad0 Case Key.NumPad1 Case Key.NumPad2 Case Key.NumPad3 Case Key.NumPad4 Case Key.NumPad5 Case Key.NumPad6 Case Key.NumPad7 Case Key.NumPad8 Case Key.NumPad9 Case Key.Decimal ' , Case Else Select Case e.PlatformKeyCode Case 188, 110, 43 ' ",", ", Numpad" , ", Mac" If tbTbx.Text.IndexOf(",") > -1 Then e.Handled = True Return End If Case Else e.Handled = True Return End Select End Select End Sub
Tags: , , | Categories: ASP.Net, Silverlight Posted by Christoph on 7/23/2009 10:21 AM | Comments (0)
Wwnn Silverlight einen Webservice über SSL benutzen soll, müssen dazu folgende 3 Dinge beachtet werden: 1) eine clientaccesspolicy.xmlim Webroot haben: <?xml version="1.0" encoding="utf-8" ?> 2) eine crossdomain.xml im Webroot haben: <?xml version="1.0"?> 3) im Silverlight: ich benutze dazu meisst eine Statische Methode, die den Webservice erstellt, um die jeweilige URL vom System an die Umgebung anpassen zu können. Public Shared Function GetWebservice() As BackendService.BackendServiceSoapClient '--Detect Current URL Dim Url As String = String.Format("{0}BackendService.asmx", Settings.RootURLAll) Dim Binding As ServiceModel.BasicHttpBinding If Settings.RootURLAll.IndexOf("https") > -1 Then Binding = New ServiceModel.BasicHttpBinding(ServiceModel.BasicHttpSecurityMode.Transport) With {.MaxReceivedMessageSize = 5000 * 1024} Else Binding = New ServiceModel.BasicHttpBinding(ServiceModel.BasicHttpSecurityMode.None) With {.MaxReceivedMessageSize = 5000 * 1024} End If '--Create new Webservice Client Dim Binding As New ServiceModel.BasicHttpBinding(ServiceModel.BasicHttpSecurityMode.Transport) With {.MaxReceivedMessageSize = 5000 * 1024} Dim WS As New BackendService.BackendServiceSoapClient(Binding, New ServiceModel.EndpointAddress(Url)) Return WS End Function
Categories: Silverlight, Visual Stutio Posted by Christoph on 1/28/2009 6:37 PM | Comments (0)
Ich programmiere gerade ein Projekt in Silverlight 2, und immer wenn ich im Visual Studio per F5 die APplikation zum Debuggen starte, und dann wirklich mal ein Fehler im Code auftaucht, bekomme ich folgende Fehlermeldung: Produkt Microsoft Visual Studio 2008 Problem Funktioniert nicht mehr Datum 28.01.2009 18:24 Status Bericht gesendet Problemsignatur Problemereignisame: APPCRASH Anwendungsname: devenv.exe Anwendungsversion: 9.0.30729.1 Anwendungszeitstempel: 488f2b50 Fehlermodulname: StackHash_5104 Fehlermodulversion: 6.0.6001.18000 Fehlermodulzeitstempel: 4791a783 Ausnahmecode: c0000374 Ausnahmeoffset: 000aada3 Betriebsystemversion: 6.0.6001.2.1.0.256.1 Gebietsschema-ID: 1031 Zusatzinformation 1: 5104 Zusatzinformation 2: 491133e6875047042f39cbbc152c1a0e Zusatzinformation 3: 6717 Zusatzinformation 4: a5982a4c4ba4763232c47f02134b8bd8 Die Lösung ist ganz einfach: Im Visual Studio die Sprache auf Englisch setzen. Da gibts wohl noch einige “Ungenauigkeiten”, wenn verschiedene Sprachversionen (insbesondere nicht-englisch) benutzt werden).
Tags: , , | Categories: Administration, ASP.Net, Vista, Silverlight Posted by Christoph on 12/23/2008 12:04 PM | Comments (2)
Bei mir bringt der ASP.Net Development Server (der für die Entwicklung von Silverlight Anwendungen extrem praktisch ist) im Internet Explorer immer einen Fehler, dass die Seite nicht gefunden werden kann (URL: http://localhost:64720/Default.html). Die gleiche URL funktioniert jedoch im Firefox problemlos, und auch im IE funktioniert die URL, wenn man anstatt localhost die 127.0.0.1 benutzt. Das Problem liegt ein einem Eintrag in der hosts Datei, der für IPV6 gilt, jedoch hört der DevServer nicht auf IPV6. also: ab in die c:\Windows\System32\Drivers\etc\hosts und vor die "::1 localhost" eine "#". Damit ist das Problem behoben :-)  Tipp: am einfachsten gehht das Ändern der hosts, wenn man die in einen anderen Ordner kopiert, ändert, und wieder zurückkopiert. Dann hat man nur einen UAC Dialog.