如何在WPF中将一个内容设置为多个按钮

时间:2017-02-01 17:01:54

标签: c# wpf

我有一些按钮 - 在不同的窗口 - 具有相同的内容。但如果两个窗口一起浮出水面,那么第一个窗口的按钮内容就会消失。

按钮样式是:

<Style TargetType="{x:Type Button}" x:Key="BSaveBtn">
    <Setter Property="Padding" Value="5"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Width" Value="70"/>
    <Setter Property="Height" Value="68"/>
    <Setter Property="Background" Value="{DynamicResource FlatGreen}"/>
    <Setter Property="Template" Value="{DynamicResource FlatGreenBtnHover}"/>
    <Setter Property="Margin" Value="5"/>
    <Setter Property="Content">
        <Setter.Value>
            <StackPanel Orientation="Vertical" FlowDirection="RightToLeft">
                <Image Width="30" Source="/login;component/img/buttonpic/save.png"/>
                <TextBlock Text="save" FontSize="16" FontFamily="/login;component/fonts/#Droid Arabic Kufi" Foreground="White" HorizontalAlignment="Center"/>
            </StackPanel>
        </Setter.Value>
    </Setter>
</Style>
窗口中的

按钮代码为:

<Button Style="{DynamicResource BSaveBtn}" Template="{DynamicResource FlatGreenBtnHover}" />

只有内容出现问题 - 不是另一种样式属性。

2 个答案:

答案 0 :(得分:1)

当我在这里测试时,似乎对我工作正常。

我注意到的一些事情可能会有所帮助。你不需要它们是DynamicResource,它们应该是StaticResource,除非你打算修改它们。

我假设你在Windows.Resource部分声明这些或在每个窗口重复它们? 如果是这样,您应该将它们集中到ResourceDictionary。

创建一个新的资源字典,将你的风格放在那里:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style TargetType="{x:Type Button}" x:Key="BSaveBtn">
        <Setter Property="Padding" Value="5"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="Width" Value="70"/>
        <Setter Property="Height" Value="68"/>
        <Setter Property="Background" Value="{DynamicResource FlatGreen}"/>
        <Setter Property="Template" Value="{DynamicResource FlatGreenBtnHover}"/>
        <Setter Property="Margin" Value="5"/>
        <Setter Property="Content">
            <Setter.Value>
                <StackPanel Orientation="Vertical" FlowDirection="RightToLeft">
                    <Image Width="30" Source="/login;component/img/buttonpic/save.png"/>
                    <TextBlock Text="save" FontSize="16" FontFamily="/login;component/fonts/#Droid Arabic Kufi" Foreground="White" HorizontalAlignment="Center"/>
                </StackPanel>
            </Setter.Value>
        </Setter>
    </Style>

</ResourceDictionary>

然后在App.xaml中输入以下内容:

<ResourceDictionary>    
    <ResourceDictionary Source="MyResources.xaml" />    
</ResourceDictionary>

图像应该在字典中,以避免多次加载。只需在ResourceDictionary中添加一行,如下所示:

<BitmapImage UriSource="/login;component/Images/Save.png" x:Key="Save" PresentationOptions:Freeze="True" />

设置PresentationOptions:如果永远不会修改图像,冻结也会有所帮助。

您对图像的调用将变为:

<StackPanel Orientation="Vertical" FlowDirection="RightToLeft">
    <Image Width="30" Source="{StaticResource Save}"/>
        <TextBlock Text="save" FontSize="16"      FontFamily="/login;component/fonts/#Droid Arabic Kufi" Foreground="White" HorizontalAlignment="Center"/>
</StackPanel>

一旦您的资源集中在ResourceDictionary(或多个)中,就可以轻松地在应用程序的任何位置应用这些相同的样式,并希望能够帮助解决您的问题。如果没有,请提供更多关于您遇到的问题的信息,例如示例代码,以便解决问题。

答案 1 :(得分:0)

元素的实例只能在可视化树中出现一次。您可以将Style的x:Shared属性设置为False,以便为应用该样式的每个Button创建一个新的StackPanel实例:

<Style TargetType="{x:Type Button}" x:Key="BSaveBtn" x:Shared="False">
    <Setter Property="Padding" Value="5"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Width" Value="70"/>
    <Setter Property="Height" Value="68"/>
    <Setter Property="Background" Value="{DynamicResource FlatGreen}"/>
    <Setter Property="Template" Value="{DynamicResource FlatGreenBtnHover}"/>
    <Setter Property="Margin" Value="5"/>
    <Setter Property="Content">
        <Setter.Value>
            <StackPanel Orientation="Vertical" FlowDirection="RightToLeft">
                <Image Width="30" Source="/login;component/img/buttonpic/save.png"/>
                <TextBlock Text="save" FontSize="16" FontFamily="/login;component/fonts/#Droid Arabic Kufi" Foreground="White" HorizontalAlignment="Center"/>
            </StackPanel>
        </Setter.Value>
    </Setter>
</Style>