ToggleButton根据状态更改图像

我想以下列方式使用ToggleButton:有5个不同的图像,每个图像应根据当前状态显示:

  1. 按钮已禁用
  2. 按钮启用,未选中
  3. 按钮启用,未选中,由鼠标光标指向
  4. 按钮启用,检查
  5. 按钮启用,检查,鼠标光标指向

我在这里找到了一个带有两个图像的简单示例,但是如何根据“已检查”属性更改图像?

第二个问题:如何避免为我的应用程序中的每个按钮创建不同的样式? 我使用了大约20个不同的按钮,每个按钮都有不同的图标。

到目前为止,我只在我的代码下面使用了一个图标。 是否可以使用公共代码(样式和模板)并在我想要创建按钮的部分中定义图像源(如我的代码的第3部分)?

                             

您可以通过创建UserControl来获取所需的function,该UserControl公开Command,IsChecked的依赖项属性,以及每个有状态图像的依赖项属性。 您的用户控件将包含切换按钮和图像。

您可以使用MultiDataTriggers检测状态并根据状态切换图像。

因为您为有状态图像公开了DependencyProperties,所以只要您声明控件,就可以使用Databinding设置它们。 一旦状态发生变化,触发器将自动为您切换图像源。

[编辑:添加一些代码以帮助解释]

以下是让您入门的部分示例:

MyToggleButton.xaml:

         

和cs文件:

 using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace ToggleTest { ///  /// Interaction logic for ToggleButton.xaml ///  public partial class MyToggleButton : UserControl { public MyToggleButton() { InitializeComponent(); } public static readonly DependencyProperty EnabledUncheckedProperty = DependencyProperty.Register( "EnabledUnchecked", typeof(ImageSource), typeof(MyToggleButton), new PropertyMetadata(onEnabledUncheckedChangedCallback)); public ImageSource EnabledUnchecked { get { return (ImageSource)GetValue(EnabledUncheckedProperty); } set { SetValue(EnabledUncheckedProperty, value); } } static void onEnabledUncheckedChangedCallback( DependencyObject dobj, DependencyPropertyChangedEventArgs args) { //do something if needed } public static readonly DependencyProperty DisabledUncheckedProperty = DependencyProperty.Register( "DisabledUnchecked", typeof(ImageSource), typeof(MyToggleButton), new PropertyMetadata(onDisabledUncheckedChangedCallback)); public ImageSource DisabledUnchecked { get { return (ImageSource)GetValue(DisabledUncheckedProperty); } set { SetValue(DisabledUncheckedProperty, value); } } static void onDisabledUncheckedChangedCallback( DependencyObject dobj, DependencyPropertyChangedEventArgs args) { //do something if needed } public static readonly DependencyProperty EnabledCheckedProperty = DependencyProperty.Register( "EnabledChecked", typeof(ImageSource), typeof(MyToggleButton), new PropertyMetadata(onEnabledCheckedChangedCallback)); public ImageSource EnabledChecked { get { return (ImageSource)GetValue(EnabledCheckedProperty); } set { SetValue(EnabledCheckedProperty, value); } } static void onEnabledCheckedChangedCallback( DependencyObject dobj, DependencyPropertyChangedEventArgs args) { //do something if needed } public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register( "IsChecked", typeof(Boolean), typeof(MyToggleButton), new PropertyMetadata(onCheckedChangedCallback)); public Boolean IsChecked { get { return (Boolean)GetValue(IsCheckedProperty); } set { if(value != IsChecked) SetValue(IsCheckedProperty, value); } } static void onCheckedChangedCallback( DependencyObject dobj, DependencyPropertyChangedEventArgs args) { //do something, if needed } } } 

这个控件可以像这样使用:

  

这个解决方案很简单:

         

Ed Gonzalez爵士,谢谢你的好榜样。

唯一的问题是绑定到MyToggleButton.IsChecked依赖项属性不能正常工作(平台:Windows 7.,NET 4.0,VS2010)。 所以我在你的例子中做了一些改变。

XAML:

    

CS:

 public partial class ToggleButtonEx : ToggleButton { public ToggleButtonEx() { InitializeComponent(); } public static readonly DependencyProperty EnabledUncheckedProperty = DependencyProperty.Register( "EnabledUnchecked", typeof(ImageSource), typeof(ToggleButtonEx), new PropertyMetadata(onEnabledUncheckedChangedCallback)); public ImageSource EnabledUnchecked { get { return (ImageSource)GetValue(EnabledUncheckedProperty); } set { SetValue(EnabledUncheckedProperty, value); } } static void onEnabledUncheckedChangedCallback( DependencyObject dobj, DependencyPropertyChangedEventArgs args) { //do something if needed } public static readonly DependencyProperty DisabledUncheckedProperty = DependencyProperty.Register( "DisabledUnchecked", typeof(ImageSource), typeof(ToggleButtonEx), new PropertyMetadata(onDisabledUncheckedChangedCallback)); public ImageSource DisabledUnchecked { get { return (ImageSource)GetValue(DisabledUncheckedProperty); } set { SetValue(DisabledUncheckedProperty, value); } } static void onDisabledUncheckedChangedCallback( DependencyObject dobj, DependencyPropertyChangedEventArgs args) { //do something if needed } public static readonly DependencyProperty EnabledCheckedProperty = DependencyProperty.Register( "EnabledChecked", typeof(ImageSource), typeof(ToggleButtonEx), new PropertyMetadata(onEnabledCheckedChangedCallback)); public ImageSource EnabledChecked { get { return (ImageSource)GetValue(EnabledCheckedProperty); } set { SetValue(EnabledCheckedProperty, value); } } static void onEnabledCheckedChangedCallback( DependencyObject dobj, DependencyPropertyChangedEventArgs args) { //do something if needed } private void ToggleButton_CheckedChanged(object sender, RoutedEventArgs e) { ChangeImage(); } private void ToggleButton_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) { ChangeImage(); } private void ToggleButton_Loaded(object sender, RoutedEventArgs e) { ChangeImage(); } private void ChangeImage() { if (IsEnabled) { if(IsChecked == true) ButtonImage.Source = EnabledChecked; else ButtonImage.Source = EnabledUnchecked; } else { ButtonImage.Source = DisabledUnchecked; } } } 

使用模式保持不变:

  

我为我的RibbonToggleButton做了同样的事情,但我认为有点容易。 我将样式触发器放在按钮内,而不是使用额外的图像元素。

       

Ed Gonzalez爵士,谢谢你的好榜样。

唯一的问题是绑定到MyToggleButton.IsChecked依赖项属性不能正常工作(平台:Windows 7.,NET 4.0,VS2010)。 所以我在你的例子中做了一些改变。

只需删除IsChecked DependencyProperty上的静态,在IsChecked ChangeImage()中添加你的ChangeImage() ,并且Sir Ed Gonzalez的例子运行良好^^

 public readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register( "IsChecked" ... public Boolean IsChecked ... if (value != IsChecked) SetValue(IsCheckedProperty, value); ChangeImage();