wpf resources styles resourcedictionary

wpf - resourcedictionary c#



WPF no aplica estilo al primer elemento (2)

Tengo una ventana WPF simple que tiene 12 botones. Quiero que el mismo estilo se aplique a todos ellos. Este código produce el mismo error:

<Window x:Class="TestApp.TestWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TestWindow" Height="400" Width="500" WindowStyle="None" WindowState="Maximized"> <Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Resources/AllResources.xaml"/> <ResourceDictionary> <Style TargetType="{x:Type Button}"> <Setter Property="FontSize" Value="100"/> </Style> </ResourceDictionary> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Window.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Button Grid.Column="0" Content="1" Name="Button1"/> <Button Grid.Column="1" Content="2" Name="Button2"/> </Grid> </Window>

El primer botón no obtiene el estilo aplicado, pero el segundo sí lo hace. Podría establecer una clave y usarla en cada botón, pero preferiría que WPF se encargue de eso por mí. Acabo de descubrir, mientras escribía esto, que cuando no incluyo el ResourceDictionary externo, funciona como se esperaba. Este será un problema en el futuro, ya que mi aplicación se expande, ya que tengo varias ventanas que necesitan compartir los mismos recursos. El código modificado es el siguiente:

<Window x:Class="TestApp.TestWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TestWindow" Height="400" Width="500" WindowStyle="None" WindowState="Maximized"> <Window.Resources> <Style TargetType="{x:Type Button}"> <Setter Property="FontSize" Value="100"/> </Style> </Window.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Button Grid.Column="0" Content="1" Name="Button1"/> <Button Grid.Column="1" Content="2" Name="Button2"/> </Grid> </Window>

También funciona si yo (en lugar de eliminar los diccionarios combinados) agrego un atributo x: Key = "key" y luego asigna explícitamente ese estilo a cada botón.

Cuál es el problema aquí? ¿Por qué el primero omite "Button1" y el segundo no?


Aunque no produce un error, según la documentación:

un diccionario usado en diccionarios combinados no debe tener contenido y debe usar la propiedad Source para referirse a otro diccionario indirectamente. De hecho, si coloca el Style en un diccionario de recursos y hace referencia a ambos en la combinación, funcionará como debería.

Solo podemos especular por qué esto no es compatible, pero como no lo es, y como la solución es fácil, no podemos quejarnos demasiado, excepto que deseamos que recibamos un error al momento de la compilación.


He visto este problema un par de veces antes y es un "error" bastante extraño. Ocurre cuando pones un Style directamente en un ResourceDictionary dentro de <ResourceDictionary.MergedDictionaries> . El Style se omite para el primer elemento. Este código produce el mismo resultado, el estilo se omite para el primer ListBoxItem

<Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary> <Style TargetType="{x:Type ListBoxItem}"> <Setter Property="Foreground" Value="Green"/> </Style> </ResourceDictionary> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Window.Resources> <ListBox> <ListBoxItem Content="Item 1"/> <ListBoxItem Content="Item 2"/> <ListBoxItem Content="Item 3"/> </ListBox>

Para que funcionen tanto los estilos como los MergedDictionaries, hazlo así.

<Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Resources/AllResources.xaml"/> </ResourceDictionary.MergedDictionaries> <Style TargetType="{x:Type Button}"> <Setter Property="FontSize" Value="100"/> </Style> </ResourceDictionary> </Window.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Button Grid.Column="0" Content="1" Name="Button1"/> <Button Grid.Column="1" Content="2" Name="Button2"/> </Grid>