/ / Estilo só funciona para a primeira ocorrência quando fora de Grid.Resources? - xaml, microsoft-metro, winrt-xaml, uwp

Estilo só funciona para a primeira ocorrência quando fora de Grid.Resources? - xaml, microsoft-metro, winrt-xaml, uwp

Eu tenho um gridview com um modelo de dados queinclui um togglebutton. O datatemplate para os itens no GridView possui uma grade, com um botão de alternância estilizado. O estilo do botão de alternância está localizado em Grid.Resources. Ele funciona bem, mas quando eu movo o estilo de Grid.Resources para Page.Resources ou App.xaml, o conteúdo dentro do botão definido no estilo desaparece de todos, exceto da primeira ocorrência do botão na exibição de grade. Aqui está o estilo:

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

Aqui estão as capturas de tela do comportamento: http://imgur.com/a/8iZaD A imagem superior é a original quando o estilo estava localizado em Grid.Resources e a parte inferior é quando o estilo é movido.

Respostas:

1 para resposta № 1

Você pode solucionar esse comportamento usando ContentTemplate no seu estilo em vez de conteúdo.

<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 para resposta № 2

Style pode trabalhar fora do seu DataTemplate, o problema aqui é o Path você definiu como o Content do seu ToggleButton.

Recursos XAML em Style deve ser compartilhável Recursos XAML devem ser compartilháveis):

Para um objeto existir em um ResourceDictionary, esse objeto deve ser compartilhável.

Ser compartilhável é necessário porque, quando oA árvore de objetos de um aplicativo é construída e usada em tempo de execução, os objetos não podem existir em vários locais na árvore. Internamente, o sistema de recursos cria cópias de valores de recursos para usar no gráfico de objetos do seu aplicativo quando cada recurso XAML é solicitado.

Mas UIElement nunca pode ser compartilhável e Path herda de UIElement assim Path não é compartilhável. Ao definir seu Style dentro DataTemplate e colocando o Style fora da DataTemplate, cada ToggleButton nos itens aplicar o Style, mas o Path só pode ser exibido uma vez, pois não é compartilhável. Para testá-lo, você pode adicionar um objeto Style gostar:

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

Então você vai encontrar todos os fundos do seu ToggleButton tornar-se vermelho. Além disso, você pode colocar diretamente dois ToggleButton em um StackPanel gostar:

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

Você também pode encontrar apenas o primeiro ToggleButton tem o caminho.

E quando você coloca o Style dentro DataTemplate, cada item terá seu próprio Resources, então funciona bem.

Se você usar ContentTemplate como @ Jean-Sébastien Dupuy disse, então o Value se tornar um DataTemplate que é compartilhável como é derivado de FrameworkTemplate, então também funciona bem.


0 para resposta № 3

A melhor maneira de mover seus estilos no XAML é usando o designer Blend.

Você pode ver e organizar seus estilos deSeção de recursos no Blend. Depois disso, você pode arrastar e soltar seu estilo local em App.xaml ou Resources.xaml. Todas as referências serão atualizadas automaticamente, você pode verificar abaixo da imagem gif.

insira a descrição da imagem aqui