动态改变一种风格的特性

时间:2011-09-24 15:49:27

标签: c# wpf xaml

我正在研究WPF应用程序。我有一个资源字典,我在其中为ToolTip和Button编写了自定义样式。实际上,对于按钮我已经做了两种风格。 其中之一,包括一个出现在buttoon内容左侧的图像。

<Style x:Key="ButtonImageStyle" TargetType="{x:Type Button}">
     ........
   <TextBlock Margin="5.25,2.417,5.583,5.25" Foreground = White />
   <Image x:Name="ButtonImage" Source="/MyProject;component/Images/icoMainMenu01.png" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="-100,0,0,0" Width="16" Height="16"/>
   .... </Style

现在,在MainWindow.xaml中我有以下内容:

<Button Style="{DynamicResource ButtonImageStyle}" x:Name="JustButton" Click="JustButton_Click" Height="50" ToolTip="Press for 1" Content="1" Margin="310,282,400,238"  />

我希望能够更改该图像。我将有8个按钮,我希望每个按钮都有一个与之关联的不同图像。 你们有什么想法吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

有各种选项,从(ab)使用Tag等属性到UserControl中的子类或合成,您还可以创建attached property

最干净的可能是子类化,然后您可以为要使用的dependency property创建一个新的ImageSource,然后您可以使用TemplateBinding在默认模板中绑定。{ / p>

要进行子类化,您可以使用VS,从新项目中选择Custom Control (WPF),这应创建一个类文件,并将基本样式添加到主题资源字典中,该字典通常位于Themes/Generic.xaml中。这个课程看起来像这样:

//<Usings>

namespace Test.Controls
{
    public class ImageButton : Button
    {
        public static readonly DependencyProperty ImageProperty =
            DependencyProperty.Register("Image", typeof(ImageSource), typeof(ImageButton), new UIPropertyMetadata(null));
        public ImageSource Image
        {
            get { return (ImageSource)GetValue(ImageProperty); }
            set { SetValue(ImageProperty, value); }
        }
    }
}

现在主题会更复杂,您可以只复制一个default templates按钮并将其粘贴到默认样式中。然后你只需要在某个地方添加你的图像,但是这个绑定:

<Image Source="{TemplateBinding Image}" .../>

当您使用此控件时,您将不再需要引用样式,因为所有内容都是默认样式,现在有一个图像属性:

<controls:ImageButton Content="Lorem Ipsum"
                      Image="Img.png"/>

(要使用Tag,您只需使用普通按钮并使用TemplateBinding到标记,并将按钮的标记设置为URL)


我忘了提到另一种使用动态资源的可能性,它有点冗长但非常简单,请参阅我的this answer作为一个例子。