/ / Style funktioniert nur beim ersten Auftreten außerhalb von Grid.Resources? xaml, microsoft-metro, winrt-xaml, uwp

Style funktioniert nur beim ersten Auftreten außerhalb von Grid.Resources? - XAML, Microsoft-U-Bahn, Winrt-XAML, UWP

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 № 1

Sie 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 DataTemplateDas 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 ResourceDictionarymuss 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.

Bildbeschreibung hier eingeben