Datumsformatierung in Silverlight Datagrid

Wieder einmal ein Problem aus meiner Silverlight Schulung. Ein Teilnehmer stellt die berechtigte Frage warum in einem Silverlight Datagrid das Datum Englisch dargestellt wird. Zunächst also ans Trouble shooting. Die Culture Infos kommen aus den Browser Settings de-De- alles OK. Dann einfach mal das Datum per tostring ausgeben. Passt auch. Dann noch cross Check mit dem Dataform control. Dort wird es richtig angezeigt. Und so sieht mein Testcase aus. Zur Sicherheit habe ich auch noch einen Silverlight Kalender drauf gepackt. Auch da passt alles. Nur im Datagrid ist das Format Englisch (en-US). Ein Blick mit dem Debugger von Visual Studio 2010 offenbart das in der Eigenschaft Language en-US steht. Also kurz getestet ob folgender Code das Problem löst DataGrid1.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentUICulture.Name) Und was soll ich sagen, es klappt. Also für mich abgelegt unter Bug- Silverligth 4.0.50401.0 Btw immer wieder intersannt auf was meine Silverlight Kurs Teilnehmer so kommen.

WrapPanel in beide Richtungen

Mit dem Silverligth Toolkit erhält man ein alternatives Stackpanel, das auch den Zeilenumbruch kann. Wenn die Breite (Width) nicht ausreicht werden die UIElemente einfach in die nächste Zeile geschoben   In meiner aktuellen Silverlight Schulung fragt mich ein Kursteilnehmer ob man das auch anders anordnen kann. Ja- geht und das ganz einfach. <toolkit:WrapPanel Height="100" Orientation="Vertical"

Silverlight Listbox 1x1

Die Silverlight Listbox ist ähnlich wie ein ASP.NET Repeater die erste Wahl bei Datenbindung. Man kann Sie an ein Array oder komplexe Liste binden. Wenn man eine komplexe Liste bindet sieht das Ergebnis eventuell etwas seltsam aus. Zunächst der Code für die Daten. Private Sub page27_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded Dim p As New List(Of person) p.Add(New person With {.alter = 27, .Firma = "ppedv ag", .Name = "Hannes"}) p.Add(New person With {.alter = 32, .Firma = "ppedv ag", .Name = "Andreas"}) p.Add(New person With {.alter = 23, .Firma = "ppedv ag", .Name = "Bernhard"}) p.Add(New person With {.alter = 45, .Firma = "ppedv ag", .Name = "Stefan"}) p.Add(New person With {.alter = 12, .Firma = "ppedv ag", .Name = "Arnold"}) ListBox1.ItemsSource = p End Sub Dann noch die laufende Anwendung Um die passende Eigenschaft anzuzeigen gibt es die Eigenschaft DisplayMemberPath="Name" Man kann aber auch das Template der Listbox verwenden und erhält man dafür nahezu unbegrenzte Layout Möglichkeiten. Die einzelnen Daten werden im Itemtemplate erstellt. Hier mit Border und TextBlock <ListBox Height="152" HorizontalAlignment="Left"             Margin="58,25,0,0" Name="ListBox1" VerticalAlignment="Top" Width="148">            <ListBox.ItemTemplate>                <DataTemplate>                    <Border CornerRadius="5" BorderThickness="1" BorderBrush="#FF1349ED" Width="100" Height="24">                    <TextBlock Text="{Binding Name}" Margin="3,0,0,7" VerticalAlignment="Center"/>                    </Border>                </DataTemplate>            </ListBox.ItemTemplate></ListBox>Sieht zwar im Programm ganz nett aus    aber im Visual Studio 2010 Designer sieht man gar nichts. Da kann Expression Blend schon wesentlich mehr. Control auswählen, Context Menu-Edit Additonal Templates- Edit Generated Items- Edit Current. Oder noch einfacher per Breadcrump Navigation ( hier oben im Bild) So sieht man wenigstens den Border. Wie man Design Daten Sichtbar machen kann habe ich schon früher gepostet. Aber auch das generelle Layout kann man verändern. Daszu kommt das Itemspanel zum Einsatz. In diesem Beispiel ordnen wir die Einträge nebeneinander an. <ListBox.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal"></StackPanel> </ItemsPanelTemplate> </ListBox.ItemsPanel> Und so schauts aus. Weiter gehts mit dem ItemsContainerStyle. Folgender XAML Code und das vorher-nachher Bild <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem" > <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListBoxItem"> <ContentPresenter x:Name="contentPresenter" Margin="4" /> </ControlTemplate> </Setter.Value> </Setter> </Style> </ListBox.ItemContainerStyle> Da kann man natürlich auch mehr damit machen, was XAML in Silverlight so her gibt. Z.B. einen roten Rahmen außen rum machen. <ControlTemplate TargetType="ListBoxItem"> <Border BorderBrush="red" BorderThickness="1"> <ContentPresenter:Name="contentPresenter" Margin="4" /></Border> </ControlTemplate> Wenn man den Container ganz aussen rum braucht, dann geht’s ab ins ControlTemplate. <ListBox.Template> <ControlTemplate> <Grid> <ScrollViewer> <Border BorderBrush="Green" BorderThickness="2"> <ItemsPresenter /></Border> </ScrollViewer> </Grid> </ControlTemplate> </ListBox.Template>             Außerdem noch ein Link auf einen älteren Silverlight 2 Artikel dazu der beschreibt wie man den Hintergrund abhängig von Datenbank Wert ändert.

Silverlight 4 ist (schon wieder) fertig

Silverlight 4 Tools für Visual Studio 2010 waren bisher nur im RC Status. Es sind in den 4 Wochen einige neue Features hinzugekommen:   · Support für Silverlight 4 im  Silverlight Designer und Project System · RIA Services Application Templates und Libraries für einfacheren Zugriff auf Data Services · Support für Silverlight 4 elevated trust und out-of-browser Applications · Erweiterter  Support für Silverlight 4 Funktionen wie: Verwendung von Implicit Styles  Go To Value Definition - direkt vom Control zum Style navigieren   Style Intellisense -  Data Source Window Ausgabe  Data Source Selector  Grid Row und Column Context Menu  Thickness Editor Sample Data Support zur Entwurfszeit Support für Silverlight 4 Out-of-Browser Applications Automatischer Start und debug einer OOB Application einfachers XAP signing für Trusted OOB Applicatoins einstellen von OOB Window Es müssen alle bisherigen Silverlight Features deinstalliert werden. Ich arbeite schon eine Woche mit den RTW Bits und hatte kein einziges Problem. Der Code bleibt der gleiche. Alle Infos und Download wie immer auf www.silverlight.net.

preview von Feldern bei Datenbindung per Code

Expression Blend kennt  die Möglichkeit per Sample Data Entwurfszeit Daten für die Visualisierung zu verwenden. Viele Entwickler bevorzugen aber Code um Daten zuzuweisen. Der Designer sieht dann leider im Entwurf nicht mit welchen Daten er zu rechnen hat. Dies erschwert aber die Arbeit des UI Designers. Mein Ziel ist es sowohl im Visual Studio Designer als auch in Blend 4 ein passendes Preview für die Silverlight Anwendung zu bieten. Dazu habe ich einfach einen String als Resource deklarativ angelegt und diesen im Binding per Fallback Value zugewiesen. xmlns:sys="clr-namespace:System;assembly=mscorlib"> <UserControl.Resources>         <sys:String x:Key="strCompany">Alfreds Futterkister</sys:String>     </UserControl.Resources>         <Grid x:Name="LayoutRoot" Background="White" Loaded="LayoutRoot_Loaded">         <TextBox Height="24" HorizontalAlignment="Left" Margin="180,30,0,0" Text="{Binding CompanyName,Mode=TwoWay, FallbackValue={StaticResource strCompany}}" VerticalAlignment="Top" Width="138" />

Silverlight Out Of Browser Anwendung mit Icons versehen

In der heutigen Silverlight Schulung haben ein Teilnehmer und ich diskutiert ob eine OOB Anwendung signiert sein muss um Icons richtig anzuzeigen. Nach ein paar Test würde ich sagen: Nein. Folgende Bedingungen müssen gegeben sein. 1) Images im PNG Format für jede Auflösung exakt mit den Pixel wie konfiguriert In meinem Test hat das fehlen des 128er Images überhaupt kein Icon in der Silverligth Anwendung angezeigt. 2) Die Bilder müssen im Projekt als Content eingebunden werden. Default Wert ist Resource. Wenns klappt kommt schon beim installieren (einer signierten Anwendung) das Icon im Dialog. Generell werden Icons an folgenden Stellen verwendet Installationsdialog OOB Window Icon Menü Icon Task Bar

Mehrsprachige Silverlight Anwendungen

In meiner letzten Schulung hatte ein Teilnehmer die Frage nach Mehrsprachigkeit aufgeworfen. Leider hatte ich kein aktuelles Beispiel zur Hand und wie immer liefere ich die Antwort per Blog Eintrag nach. Wenn ich ganz ehrlich sein soll ein paar Fragen sind auch für mich offen geblieben. Aber dazu später mehr. Zunächst erzeugen wir im Projekt einen Resources Ordner. In diesem Ordner wird eine Resources Datei angelegt. Wichtig ist das der  Access Modifier Public weil wir das später für die Bindung brauchen. Dort eine (oder mehrere ) Resource Keys eingefügt. Dann müssen weitere Ressource Dateien angelegt die jeweils namentlich dem Schema resource.de-DE.resx folgen. Normalerweise müsste auch ein verkürztes Namensschema in der Form de  genügen. Das funktioniert aber in meinem Beispiel nicht. Die weiteren Resource Dateien erhalten den Access Modifier no Code Generation.  Am Ende stehen Dateien im Verzeichnis wie resources.de-DE.resx, resource.en-US usw. Dann wird's schon fast haarig. Wir müssen das Silverligth Projekt File manipulieren. Dazu per Unload Project das Projekt entladen und dann im Texteditor editieren. <SupportedCultures>      <SupportedCultures>en;en-US;de-DE</SupportedCultures>    </SupportedCultures> Dann wieder per Load Project zurück damit. In der XAML Datei wird dann der  Namensraum für die Resources eingebunden. Weiters die Ressource als Ressource eingebunden.  Ich habe hier den Namen Hannes1 als Datei Name der mehrsprachigen Dateien im Resources Verzeichnis gewählt. xmlns:local="clr-namespace:KoelnSL.My.Resources" > <UserControl.Resources> <local:hannes1 x:Key="ResSettings"></local:hannes1> </UserControl.Resources> Der Key wird dann später für die Datenbindung gebraucht. Die Bindung muss über Bindung Syntax erfolgen und nicht wie man annehmen könnte per StaticResource. <TextBlock Text="{Binding Danke, Source={StaticResource ResSettings}}"></TextBlock> In der fertigen XAP Datei muss es dann Unterverzeichnisse mit den Ressource DLL’s geben. Hier entpackt mit Winrar. Jetzt müssen wir noch dafür sorgen das man das auch vom Browser in die Website und davon in das Silverlight Control bekommt. Dazu habe ich zunächst im Browser mehrere Sprachschemen eingestellt. In der ASPX Seite hole ich diese Einstellungen im Page Attribut per auto. Man könnte diese auch handcodiert vorbelegen. <% @ Page Language="VB" AutoEventWireup="true" Culture="auto" UICulture="auto" %> Das Silverlight Plugin bekommt dann die Culture Einstellungen mitgeteilt. Auch dazu ein wenig ASP.net Code. <param name="culture" value="<%=Threading.Thread.CurrentThread.CurrentCulture %>" /> <param name="uiculture" value="<%=Threading.Thread.CurrentThread.CurrentCulture %>"/> Mein kleines Problem ist das eigentlich in UICulture it steht und damit die Silverlight Anwendung die default Ressource verwendet. Der Trick ist das Culture Setting zu verwenden in dem steht it-IT.    

WCF RIA Services auf Web Server installieren

Beim deployment von Silverlight 4 Anwendungen die WCF RIA Services verwenden kommt gerne die Fehlermeldung Could not load file or assembly 'System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. Das System kann die angegebene Datei nicht finden. Der Grund ist schlicht das die WCF Ria Services fehlen. Man kann das MSI Paket zwar runterladen aber bei der Installation wird ein Visual Studio 2010 verlangt und das gibt's eher selten am Web Server. Workaround msiexec /i RiaServices.msi SERVER=TRUE

Insert mit den WCF RIA Services schlgt fehl

to update the EntitySet 'QOSeeeLog' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation. Wenn man der Ursprungstabelle einen Primary Key verpasst dann klappst auch mit dem Entity Framework Insert. Dann das Modell in Visual Studio refreshen und alles sollte funktionieren.

Myth Buster 60 neue Silverlight Controls Teil 2

Ich bin persönlich ein großer Kritiker des Information Overflow. Zu viele Blog Posts enthalten veraltete Informationen. Keiner redigiert solche Pseudo Infos. Die werthaltige Information versinkt im Grundrauschen des Internets. Nun auf meiner zugegebenermaßen zeitintensiven Recherche bin ich auf der Suche nach den über 60 neuen Controls in Silverlight 4. Und ich habe den Mythos in  meinem vorigen Blog Post zerstört. Viel stolzer bin ich allerdings die Ursache gefunden zu haben. Es ist eine Werbung (AD) auf der Silverlight Seite. Component One wirbt hier kaum lesbar für seine Produkte. Da das ganze schön eingebettet in die Website www.silverlight.net ist hat der schreibende Redakteur das wohl nicht erkannt.  Also Leute: glaubt nie was ihr lest. Ein bisschen grundmisstrauen ist gegenüber dem geschenkten Content immer angebracht.