WPF doesn't apply style to first element

前端 未结 2 788
小蘑菇
小蘑菇 2020-12-29 04:11

I have a simple WPF window that has 12 buttons on it. I want the same style to be applied to all of them. This code produces the same error:



        
相关标签:
2条回答
  • 2020-12-29 04:39

    I've seen this problem a couple of times before and it's a pretty weird "bug". It happends when you put a Style directly in a ResourceDictionary inside <ResourceDictionary.MergedDictionaries>. The Style is skipped for the first item. This code produces the same result, the Style is skipped for the first 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>
    

    To get both the styles and MergedDictionaries to work, do it like this instead

    <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>
    
    0 讨论(0)
  • 2020-12-29 04:46

    Although it does not produce an error, according to the documentation:

    • ResourceDictionary.MergedDictionaries Property

    a dictionary used in merged dictionaries should not have content and should use the Source property to refer to another dictionary indirectly. In fact if you put the Style in a resource dictionary and reference both of them in the merge, it works as it should.

    We can only speculate why this is not supported but since it isn't, and since the workaround is easy, we can't complain too bitterly except to wish that we received an error at compile time.

    0 讨论(0)
提交回复
热议问题