WPF не применяет стиль к первому элементу - PullRequest
24 голосов
/ 27 января 2011

У меня есть простое окно WPF с 12 кнопками. Я хочу, чтобы ко всем из них применялся один и тот же стиль. Этот код выдает ту же ошибку:

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

Первая кнопка не получает стиль, применяемый к ней, но вторая делает. Я мог бы установить ключ и использовать его на каждой кнопке, но я бы предпочел, чтобы WPF справился с этим для меня. Я только что обнаружил во время написания этого, что, когда я не включаю внешний ResourceDictionary, он работает как ожидалось. Это будет проблемой в будущем, поскольку мое приложение расширяется, поскольку у меня есть несколько окон, которые должны совместно использовать одни и те же ресурсы. Измененный код выглядит следующим образом:

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

Это также работает, если я (вместо удаления объединенных словарей) добавляю атрибут x: Key = "key" и затем явно назначаю этот стиль каждой кнопке.

В чем здесь проблема? Почему первый пропускает «Button1», а второй нет?

Ответы [ 2 ]

17 голосов
/ 27 января 2011

Я видел эту проблему пару раз раньше, и это довольно странная "ошибка".Это происходит, когда вы помещаете Style непосредственно в ResourceDictionary внутри <ResourceDictionary.MergedDictionaries>.Style пропускается для первого элемента.Этот код дает тот же результат, стиль пропускается для первого 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>

Чтобы заставить работать и стили, и MergedDictionaries, сделайте это вместо этого

<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>
4 голосов
/ 27 января 2011

Хотя это не приводит к ошибке, согласно документации:

словарь, используемый в объединенных словаряхне должен иметь содержимого и должен использовать свойство Source для косвенной ссылки на другой словарь.На самом деле, если вы поместите Style в словарь ресурсов и сослаться на них обоих в слиянии, это сработает как следует.

Мы можем только предположить, почему это не поддерживается, но так как это не так,и поскольку обходной путь прост, мы не можем жаловаться слишком горько, кроме как желая, чтобы мы получили ошибку во время компиляции.

...