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 № 1Moż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.