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 № 1Você 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.