Autor |
Beitrag |
UGrohne
Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mi 04.02.09 22:18
Hallo,
ich setze mich gerade tief mit WPF auseinander und habe dafür u.a. ein DataTemplate für eine ListBox erstellt, in dem ein StackPanel mit mehreren TextBlocks drin ist.
Diese Blöcke möchte ich gern formatieren, ohne jedem TextBlock manuell einen Style zuweisen zu müssen. Gibt es eine Möglichkeit über einen Style für das StackPanel auch Eigenschaften der Unterelemente, z.B. alle vom Typ TextBlock zu setzen?
XML-Daten 1: 2: 3: 4:
| <Style x:Key="StackPanelForListBox" TargetType="{x:Type StackPanel}"> <Setter Property="Height" Value="15"/> <Setter Property="Orientation" Value="Horizontal"/> </Style> |
|
|
Kha
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 05.02.09 13:38
|
|
UGrohne
Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Do 05.02.09 15:41
OK, die erste Möglichkeit werde ich mal probieren, wenn mein Rechner wieder tut (im Augenblick sitze ich an einem MacBook).
Wofür? Im ersten Moment dachte ich, ich mache ein DataTemplate für die ListBox. Da mein DataContext Objekte mit mehreren Eigenschaften beinhaltet, von denen ich mehrere anzeigen möchte, habe ich ein StackPanel in das DataTemplate gebaut, das mir mehrere Eigenschaften über mehrere TextBlocks anzeigt (siehe oben). Ich werde aber mehrere dieser DataTemplates haben (für jede Klasse, die ich auflisten werde) und möchte ich mir die Arbeit ersparen, immer einen Style zum TextBlock zuweisen zu müssen.
Inzwischen bin ich aber auf die Alternative des Converters gekommen, mit dem ich mehrere Eigenschaften in einem TextBlock anzeigen lassen kann, indem ich einen FormatConverter schreibe, der die Methode String.Format verwendet, um alle Elemente zusammenzubauen
|
|
Kha
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 05.02.09 21:29
UGrohne hat folgendes geschrieben : | OK, die erste Möglichkeit werde ich mal probieren, wenn mein Rechner wieder tut (im Augenblick sitze ich an einem MacBook). |
Noch ein Hinweis: In der Doku steht, welche DPs das unterstützen:
Quelltext 1: 2: 3: 4: 5: 6:
| Dependency Property Information Identifier field FontSizeProperty Metadata properties set to true AffectsMeasure, AffectsRender, Inherits |
UGrohne hat folgendes geschrieben : | Inzwischen bin ich aber auf die Alternative des Converters gekommen, mit dem ich mehrere Eigenschaften in einem TextBlock anzeigen lassen kann, indem ich einen FormatConverter schreibe, der die Methode String.Format verwendet, um alle Elemente zusammenzubauen |
Ja, die Dinger sind nützlich, wären sie nicht so unglaublich hässlich . Eine ganze Klasse für eine bis ein paar Zeilen... Da würde ich den String lieber direkt in der Datenklasse generieren lassen (ToString/neue Property) oder gleich mein neues Lieblingsspielzeug MVVM benutzen . Denn das ist eine der Aufgaben des ViewModels: Das Model so aufbereiten, dass XAML was mit anfangen kann.
_________________ >λ=
|
|
UGrohne
Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Do 05.02.09 22:37
OK, das mit dem Inherit funktioniert teilweise, lediglich beim Background-Brush scheint es nicht zu gehen:
XML-Daten 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| <Style x:Key="StackPanelForListBox" TargetType="{x:Type StackPanel}"> <Setter Property="Height" Value="15"/> <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/> <Setter Property="TextBlock.Margin" Value="2,10,2,10"/> <Setter Property="Orientation" Value="Horizontal"/> <Setter Property="TextBlock.Background"> <Setter.Value> <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> <GradientStop Color="#00FF0000" Offset="0"/> <GradientStop Color="#FF000000" Offset="1"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="TextBlock.Height" Value="20"/> <Setter Property="TextBlock.FontWeight" Value="Bold"/> </Style> |
Der Rest passt
Kha hat folgendes geschrieben : | Ja, die Dinger sind nützlich, wären sie nicht so unglaublich hässlich . Eine ganze Klasse für eine bis ein paar Zeilen... Da würde ich den String lieber direkt in der Datenklasse generieren lassen (ToString/neue Property) oder gleich mein neues Lieblingsspielzeug MVVM benutzen . Denn das ist eine der Aufgaben des ViewModels: Das Model so aufbereiten, dass XAML was mit anfangen kann. |
So hässlich finde ich sie nicht, sind doch schnell erstellt . Einzig, dass dann das Bearbeiten in Blend nicht mehr funktioniert, nervt ein wenig. Aber zum MVVM hab ich auch schon ein Dokument auf dem Schreibtisch liegen. Das kommt morgen dran, sobald ich die Grundlagen zum Entity Framework noch drauf habe
|
|
Kha
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 06.02.09 13:40
UGrohne hat folgendes geschrieben : | OK, das mit dem Inherit funktioniert teilweise, lediglich beim Background-Brush scheint es nicht zu gehen: |
Ja, Background wird nicht vererbt, da müsstest du also zum Style im Style greifen. Oder etwas einfacher: Deklariere den TextBlock-Style in den Resources deiner ListBox. Der Scope des Styles ist dann zwar etwas größer, dürfte aber wohl zum gleichen Ergebnis führen.
_________________ >λ=
|
|
|