WPF XAML静态资源样式仅适用于一个项目

时间:2018-05-07 19:57:55

标签: wpf xaml resourcedictionary

所以我不明白这是怎么发生的,但是我在资源字典中定义了一个按钮样式,并在currentSlide中加载了该字典。

但它并没有应用于我想要的所有按钮,只适用于最后一个元素。

风格:

Windows.Resources

加载词典:

<Style TargetType="{x:Type Button}" x:Key="FolderOpenBtn">
    <Setter Property="Content">
        <Setter.Value>
            <StackPanel Orientation="Horizontal">
                <Viewbox Width="16" Height="16" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Margin="0,0,2,0">
                    <Rectangle Width="16" Height="16">
                        <Rectangle.Fill>
                            <DrawingBrush>
                                <DrawingBrush.Drawing>
                                    <DrawingGroup>
                                        <DrawingGroup.Children>
                                            <GeometryDrawing Brush="#00FFFFFF" Geometry="F1M0,0L16,0 16,16 0,16z" />
                                            <GeometryDrawing Brush="#FFF6F6F6" Geometry="F1M0,2.9688L0,11.9688C0,12.5858 0.227,13.0718 0.57,13.4038 1.14,13.9478 2,13.9688 2,13.9688L13.677,13.9688 16,8.1648 16,6.9688 15,6.9688 15,4.9688C15,3.6698,13.97,2.9688,13,2.9688L10.116,2.9688 9.116,0.9688 2,0.9688C1.005,0.9688,0,1.6658,0,2.9688" />
                                            <GeometryDrawing Brush="#FFEFEFF0" Geometry="F1M2,3L8,3 9,5 13,5 13,8 4,8 2,13z" />
                                            <GeometryDrawing Brush="#FF424242" Geometry="F1M1,3L1,12C1,12.97,1.94,12.984,1.997,12.984L2,12.984 2,3 8,3 9,5 13,5 13,8 4,8 2,13 13,13 15,8 14,8 14,5C14,4,12.764,4,13,4L9.5,4 8.5,2 2,2C2,2,1,2,1,3" />
                                        </DrawingGroup.Children>
                                    </DrawingGroup>
                                </DrawingBrush.Drawing>
                            </DrawingBrush>
                        </Rectangle.Fill>
                    </Rectangle>
                </Viewbox>
                <TextBlock Text="Select..." />
            </StackPanel>
        </Setter.Value>
    </Setter>
</Style>

将样式应用于两个按钮:

按钮1

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/templates/Styles.xaml" />
            <ResourceDictionary Source="/templates/DatabaseTabItem.xaml" />
            <ResourceDictionary Source="/templates/SatzartTabItem.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

按钮2

<Button x:Name="ClassPathSelectBtn" Grid.Column="1" Grid.Row="0" MinWidth="70" Width="Auto" Margin="10,0,0,0" Height="23" VerticalAlignment="Bottom"
                                    Click="BtnSelectPath_Click" Background="#e3e3e3" Style="{StaticResource FolderOpenBtn}" />

结果看起来像这样:
two buttons only one of them with the style applied

请忽略蓝色悬停效果。

你能帮我解决我做错的事吗?

1 个答案:

答案 0 :(得分:5)

您在Style中有一个UI元素,应用于Button的内容。

由于Style和UI元素是共享的,因此只有一次它的实例。但是,单个UI元素只能显示一次,即只能有一个父元素。您可以通过将Style的x:Shared属性设置为false来解决此问题:

<Style TargetType="Button" x:Key="FolderOpenBtn" x:Shared="False">
    ...
<Style>

不是通过分配Button的内容直接创建UI元素,而是可以更好地设置ContentTemplate属性:

<Style TargetType="Button" x:Key="FolderOpenBtn">
    <Setter Property="Content" Value="Select..."/>
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Viewbox Width="16" Height="16" Margin="0,0,2,0">
                        ...
                    </Viewbox>
                    <TextBlock Text="{Binding Content,
                               RelativeSource={RelativeSource TemplatedParent}}"/>
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

这样也可以轻松替换文本,只需将Button的内容设置为默认"Select..."以外的其他值。