/ / Style działa tylko przy pierwszym wystąpieniu poza Grid.Resources? - xaml, microsoft-metro, winrt-xaml, uwp

Styl działa tylko przy pierwszym wystąpieniu, gdy poza Grid.Resources? - xaml, microsoft-metro, winrt-xaml, uwp

Mam gridview z szablonem danych, któryzawiera guzik do grzbietu. Tabliczka danych dla elementów w widoku Gridview ma siatkę ze stylizowanym guzikiem. Styl togglebutton znajduje się w Grid.Resources. Działa dobrze, ale kiedy przenoszę styl z Grid.Resources na Page.Resources lub App.xaml, zawartość przycisku zdefiniowanego w stylu znika ze wszystkich z wyjątkiem pierwszego wystąpienia przycisku w widoku siatki. Oto styl:

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

Oto zrzuty ekranu zachowania: http://imgur.com/a/8iZaD Górny obraz jest oryginalny, gdy styl znajdował się w Grid.Resources, a dolny, gdy styl zostanie przeniesiony.

Odpowiedzi:

1 dla odpowiedzi № 1

Możesz obejść to zachowanie, używając ContentTemplate w swoim stylu zamiast Content.

<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 dla odpowiedzi nr 2

Style może pracować poza twoim DataTemplate, problemem jest tutaj Path ustawiłeś jako Content Twojego ToggleButton.

Zasoby XAML w Style musi być dzielny (patrz Zasoby XAML muszą być udostępniane):

Aby obiekt istniał w ResourceDictionary, ten obiekt musi być udostępniane.

Wymagane jest dzielenie się, ponieważ, gdydrzewo obiektów aplikacji jest konstruowane i używane w czasie wykonywania, obiekty nie mogą istnieć w wielu miejscach drzewa. Wewnętrznie system zasobów tworzy kopie wartości zasobów, które mają być używane w grafie obiektu aplikacji, gdy żądany jest każdy zasób XAML.

Ale UIElement nigdy nie może być współdzielony i Path dziedziczy z UIElement więc Path nie można udostępniać. Podczas ustawiania Style w DataTemplate i oddanie Style na zewnątrz DataTemplate, każdy ToggleButton w przedmiotach zastosuj Style, ale Path może wyświetlać tylko raz, ponieważ nie można go udostępnić. Aby go przetestować, możesz dodać obiekt do swojego Style lubić:

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

Następnie znajdziesz wszystkie tła swojego ToggleButton stać się czerwony. Możesz też bezpośrednio umieścić dwa ToggleButton w StackPanel lubić:

<StackPanel>
<ToggleButton Style="{StaticResource teststyle}" />
<ToggleButton Style="{StaticResource teststyle}" />
</StackPanel>

Możesz także znaleźć tylko pierwszy ToggleButton mieć ścieżkę.

A kiedy położysz Style wewnątrz DataTemplate, każdy przedmiot będzie miał swój własny Resources, więc działa dobrze.

Jeśli użyjesz ContentTemplate jak @ Jean-Sébastien Dupuy powiedział, a następnie Value stać się DataTemplate który jest współdzielony tak jak pochodzi FrameworkTemplate, więc działa również dobrze.


0 dla odpowiedzi № 3

Najlepszym sposobem na przeniesienie stylów w XAML jest użycie projektanta Blend.

Możesz przeglądać i organizować swoje styleSekcja Zasoby w Blend. Następnie możesz przeciągnąć i upuścić lokalny styl do App.xaml lub Resources.xaml. Wszystkie referencje zostaną zaktualizowane automatycznie, możesz sprawdzić poniżej obraz gif.

wprowadź opis obrazu tutaj