Чтобы содержимое кнопки (надпись/картинка) при изменении ее активности (IsEnabled) менялось, можно добавить дополнительное свойство DisabledContent и не следить за состоянием кнопки “вручную”.
Вот о чем я говорю:
А вот реализация расширенной версии класса System.Windows.Controls.Button:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
class ActionButton : Button { private object enabledContent; public ActionButton() { IsEnabledChanged += ActionButton_IsEnabledChanged; } protected override void OnContentChanged(object oldContent, object newContent) { if (this.IsEnabled) { this.enabledContent = newContent; } base.OnContentChanged(oldContent, newContent); } private void ActionButton_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) { if ((bool)e.NewValue) { if (enabledContent != null) { Content = enabledContent; } } else if (DisabledContent != null) { Content = DisabledContent; } } public object DisabledContent { get { return GetValue(ImageProperty); } set { SetValue(ImageProperty, value); } } public static readonly DependencyProperty ImageProperty = DependencyProperty.Register("DisabledContent", typeof(object), typeof(ActionButton), new PropertyMetadata((d, e) => { var button = d as ActionButton; if (button != null) { var newValue = e.NewValue; button.DisabledContent = newValue; if (!button.IsEnabled && newValue != null) { button.enabledContent = button.Content; button.Content = newValue; } } })); } |
Использование:
1 2 3 4 5 6 7 8 |
xmlns:local="clr-namespace:LOCAL_NAMESPACE" ... <TabControl.Resources> <Image x:Key="read" Source="../Resources/read_24.png" x:Shared="false"/> <Image x:Key="read_inactive" Source="../Resources/read_24_gray.png" x:Shared="false"/> </TabControl.Resources> ... <local:ActionButton Content="{StaticResource read}" DisabledContent="{StaticResource read_inactive}" /> |