Ich habe eine Gridview mit einer Datenvorlage welcheBeinhaltet einen Togglebutton. Die Datenvorlage für die Elemente in der Rasteransicht enthält ein Raster mit einem stilisierten Togglebutton. Der Stil für den Togglebutton befindet sich in Grid.Resources. Es funktioniert einwandfrei, aber wenn ich den Stil von Grid.Resources nach Page.Resources oder App.xaml verschiebe, verschwindet der Inhalt der im Stil definierten Schaltfläche mit Ausnahme des ersten Vorkommens der Schaltfläche in der Rasteransicht von allen Inhalten. Hier ist der Stil:
<Style TargetType="ToggleButton" x:Key="teststyle">
<Setter Property="Padding" Value="0"/>
<Setter Property="Content">
<Setter.Value>
<Path HorizontalAlignment="Center" Stroke="Black" StrokeThickness="1.25" VerticalAlignment="Center" Height="9" Width="9" Stretch="Uniform" Fill="Black" Data="M 0,0 -11.78,-11.779 0,-23.561 l 1.061,1.061 -9.97,9.971 21.064,0 0,1.5 -21.064,0 9.97,9.968 L 0,0 Z" RenderTransformOrigin="0.5,0.5" >
<Path.RenderTransform>
<CompositeTransform Rotation="-90"/>
</Path.RenderTransform>
</Path>
</Setter.Value>
</Setter>
</Style>
Hier sind Screenshots des Verhaltens: http://imgur.com/a/8iZaD Das obere Bild ist das Original, als sich der Stil in Grid.Resources befand, und das untere Bild ist, als der Stil verschoben wurde.
Antworten:
1 für die Antwort № 1Sie können dieses Verhalten umgehen, indem Sie ContentTemplate in Ihrem Stil anstelle von Content verwenden.
<Page.Resources>
<Style TargetType="ToggleButton">
<Setter Property="Padding" Value="0"/>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Path HorizontalAlignment="Center" Stroke="Black" StrokeThickness="1.25" VerticalAlignment="Center" Height="9" Width="9" Stretch="Uniform" Fill="Black" Data="M 0,0 -11.78,-11.779 0,-23.561 l 1.061,1.061 -9.97,9.971 21.064,0 0,1.5 -21.064,0 9.97,9.968 L 0,0 Z" RenderTransformOrigin="0.5,0.5" >
<Path.RenderTransform>
<CompositeTransform Rotation="-90"/>
</Path.RenderTransform>
</Path>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
1 für die Antwort № 2
Style
kann außerhalb Ihrer arbeiten DataTemplate
Das Problem hier ist das Path
Sie haben als die festgelegt Content
von deinem ToggleButton
.
XAML-Ressourcen in Style
muss teilbar sein (Siehe XAML-Ressourcen müssen gemeinsam genutzt werden können):
Damit ein Objekt in einem existiert
ResourceDictionary
muss dieses Objekt sein teilbar.Teilbar sein ist erforderlich, weil, wenn dieDer Objektbaum einer App wird zur Laufzeit erstellt und verwendet. Objekte können nicht an mehreren Stellen im Baum vorhanden sein. Intern erstellt das Ressourcensystem Kopien der Ressourcenwerte, die im Objektdiagramm Ihrer App verwendet werden, wenn jede XAML-Ressource angefordert wird.
Aber UIElement
kann niemals teilbar sein und Path
erbt von UIElement
damit Path
ist nicht teilbar. Beim Einstellen Ihrer Style
im DataTemplate
und setzen die Style
außerhalb von DataTemplate
, jeden ToggleButton
in den Punkten gelten die Style
, aber die Path
kann nur einmal angezeigt werden, da es nicht gemeinsam genutzt werden kann. Um es zu testen, können Sie ein Objekt zu Ihrem hinzufügen Style
mögen:
<Style x:Key="teststyle" TargetType="ToggleButton">
<Setter Property="Padding" Value="0" />
<Setter Property="Content">
<Setter.Value>
<Path Width="9"
Height="9"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Data="M 0,0 -11.78,-11.779 0,-23.561 l 1.061,1.061 -9.97,9.971 21.064,0 0,1.5 -21.064,0 9.97,9.968 L 0,0 Z"
Fill="Black"
RenderTransformOrigin="0.5,0.5"
Stretch="Uniform"
Stroke="Black"
StrokeThickness="1.25">
<Path.RenderTransform>
<CompositeTransform Rotation="-90" />
</Path.RenderTransform>
</Path>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="Red" />
</Style>
Dann findest du alle Hintergründe von dir ToggleButton
rot werden. Sie können auch direkt zwei setzen ToggleButton
in einem StackPanel
mögen:
<StackPanel>
<ToggleButton Style="{StaticResource teststyle}" />
<ToggleButton Style="{StaticResource teststyle}" />
</StackPanel>
Sie können auch nur die erste finden ToggleButton
habe den Weg.
Und wenn Sie das setzen Style
Innerhalb DataTemplate
, jeder Artikel hat seinen eigenen Resources
, so funktioniert es gut.
Wenn du benutzt ContentTemplate
wie @ Jean-Sébastien Dupuy sagte, dann die Value
etwas werden DataTemplate
Das ist gemeinsam nutzbar, da es von abgeleitet ist FrameworkTemplate
, so funktioniert es auch gut.
0 für die Antwort № 3
Die beste Möglichkeit, Ihre Stile in XAML zu verschieben, ist die Verwendung von Blend Designer.
Sie können Ihre Stile von anzeigen und organisierenRessourcen-Bereich in Blend. Danach können Sie Ihren lokalen Stil in App.xaml oder Resources.xaml ziehen und ablegen. Alle Referenzen werden automatisch aktualisiert, Sie können von unten gif Bild überprüfen.