Отключение значка CommandButton

У меня есть кнопка «Обновить» в моем приложении WPF, прикрепленном к команде

   <ToolBar>
        <Button Command="{Binding RefreshCommand}">
                <Viewbox Width="16" Height="16">
                    <Rectangle Width="16" Height="16">
                        <Rectangle.Fill>
                            <DrawingBrush>
                                <DrawingBrush.Drawing>
                                    <DrawingGroup>
                                        <DrawingGroup.Children>
                                            <GeometryDrawing Brush="#00FFFFFF" Geometry="F1M16,16L0,16 0,0 16,0z" />
                                            <GeometryDrawing Brush="#FFF6F6F6" Geometry="F1M16,8C16,12.411 12.411,16 8,16 3.589,16 0,12.411 0,8 0,6.597 0.384,5.212 1.088,4L0,4 0,0 8,0 8,8 4,8C4,10.206 5.794,12 8,12 10.206,12 12,10.206 12,8 12,6.656 11.331,5.41 10.21,4.666L9.377,4.112 11.592,0.78 12.425,1.333C14.663,2.822,16,5.314,16,8" />
                                            <GeometryDrawing Brush="#FF00529C" Geometry="F1M15,8C15,11.859 11.859,15 8,15 4.14,15 1,11.859 1,8 1,6.076 1.801,4.292 3.121,3L1,3 1,1 7,1 7,7 5,7 5,4.002C3.766,4.931 3,6.401 3,8 3,10.757 5.243,13 8,13 10.757,13 13,10.757 13,8 13,6.321 12.164,4.763 10.764,3.833L11.871,2.167C13.83,3.469,15,5.649,15,8" />
                                        </DrawingGroup.Children>
                                    </DrawingGroup>
                                </DrawingBrush.Drawing>
                            </DrawingBrush>
                        </Rectangle.Fill>
                    </Rectangle>
                </Viewbox>
        </Button>
    </ToolBar>

Проблема в том, что если RefreshCommand недоступен из-за сбоя проверки состояния приложения, ничего не происходит со значком (где, если у меня есть текст для него вместо значка, выделение элемента на панели серым цветом обрабатывается без каких-либо дополнительных кодов обязательный.

Как оказалось, у меня ДЕЙСТВИТЕЛЬНО есть фрагмент XAML, который я хочу использовать для выделенного серым цветом состояния isEnabled=false, мне просто нужно знать, как сказать ему использовать приведенный выше фрагмент для значка, чтобы он применялся к состоянию isEnabled=true и примените другой фрагмент для false. (Извините, этот вопрос кажется хромым. WPF относительно новичок для меня).

Поскольку этот значок взят из библиотеки изображений VS, они также представлены в форматах bmp и png. Рисовать его внутри xaml не обязательно.

Для полноты вот фрагмент, которым я хочу заменить его, когда он недоступен. Теперь я замечаю, что отличается только одна строка, так что это может упростить (надеюсь)

<Viewbox Width="16" Height="16">
  <Rectangle Width="16" Height="16">
    <Rectangle.Fill>
      <DrawingBrush>
        <DrawingBrush.Drawing>
          <DrawingGroup>
            <DrawingGroup.Children>
              <GeometryDrawing Brush="#00FFFFFF" Geometry="F1M16,16L0,16 0,0 16,0z" />
              <GeometryDrawing Brush="#FFF6F6F6" Geometry="F1M16,8C16,12.411 12.411,16 8,16 3.589,16 0,12.411 0,8 0,6.597 0.384,5.212 1.088,4L0,4 0,0 8,0 8,8 4,8C4,10.206 5.794,12 8,12 10.206,12 12,10.206 12,8 12,6.656 11.331,5.41 10.21,4.666L9.377,4.112 11.592,0.78 12.425,1.333C14.663,2.822,16,5.314,16,8" />
              <GeometryDrawing Brush="#FF424242" Geometry="F1M15,8C15,11.859 11.859,15 8,15 4.14,15 1,11.859 1,8 1,6.076 1.801,4.292 3.121,3L1,3 1,1 7,1 7,7 5,7 5,4.002C3.766,4.931 3,6.401 3,8 3,10.757 5.243,13 8,13 10.757,13 13,10.757 13,8 13,6.321 12.164,4.763 10.764,3.833L11.871,2.167C13.83,3.469,15,5.649,15,8" />
            </DrawingGroup.Children>
          </DrawingGroup>
        </DrawingBrush.Drawing>
      </DrawingBrush>
    </Rectangle.Fill>
  </Rectangle>
</Viewbox>

person JoeHz    schedule 27.02.2019    source источник
comment
Возможно, написать триггер в стиле кнопки: <Trigger Property="IsEnabled" Value="False"><Setter (set content to whatever) /></Trigger>. В этом суть того, как текст становится серым (вероятно) в шаблоне управления по умолчанию.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 27.02.2019


Ответы (2)


Как предложил Эд Планкетт, вы можете установить содержимое в триггере.

Вот полный пример того, как вы можете это сделать. Я привязал свойство IsEnabled кнопки к флажку, чтобы проверить его.

Помните, что если вы собираетесь изменить свойство в триггере, вы должны установить свойство с помощью Setter в стиле, а не устанавливать его как обычное свойство.

<Window x:Class="ButtonTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ButtonTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="80" Width="800">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*"/>
      <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <Button Grid.Column="0" IsEnabled="{Binding IsChecked, ElementName=cb}" >
      <Button.Style>
        <Style TargetType="Button">

          <Setter Property="Content">
            <Setter.Value>
              <Viewbox Width="16" Height="16">
                <Rectangle Width="16" Height="16">
                  <Rectangle.Fill>
                    <DrawingBrush>
                      <DrawingBrush.Drawing>
                        <DrawingGroup>
                          <DrawingGroup.Children>
                            <GeometryDrawing Brush="#00FFFFFF" Geometry="F1M16,16L0,16 0,0 16,0z" />
                            <GeometryDrawing Brush="#FFF6F6F6" Geometry="F1M16,8C16,12.411 12.411,16 8,16 3.589,16 0,12.411 0,8 0,6.597 0.384,5.212 1.088,4L0,4 0,0 8,0 8,8 4,8C4,10.206 5.794,12 8,12 10.206,12 12,10.206 12,8 12,6.656 11.331,5.41 10.21,4.666L9.377,4.112 11.592,0.78 12.425,1.333C14.663,2.822,16,5.314,16,8" />
                            <GeometryDrawing Brush="#FF00529C" Geometry="F1M15,8C15,11.859 11.859,15 8,15 4.14,15 1,11.859 1,8 1,6.076 1.801,4.292 3.121,3L1,3 1,1 7,1 7,7 5,7 5,4.002C3.766,4.931 3,6.401 3,8 3,10.757 5.243,13 8,13 10.757,13 13,10.757 13,8 13,6.321 12.164,4.763 10.764,3.833L11.871,2.167C13.83,3.469,15,5.649,15,8" />
                          </DrawingGroup.Children>
                        </DrawingGroup>
                      </DrawingBrush.Drawing>
                    </DrawingBrush>
                  </Rectangle.Fill>
                </Rectangle>
              </Viewbox>
            </Setter.Value>
          </Setter>

          <Style.Triggers>
            <Trigger Property="IsEnabled" Value="false">
              <Setter Property="Content">
                <Setter.Value>
                  <Viewbox Width="16" Height="16">
                    <Rectangle Width="16" Height="16">
                      <Rectangle.Fill>
                        <DrawingBrush>
                          <DrawingBrush.Drawing>
                            <DrawingGroup>
                              <DrawingGroup.Children>
                                <GeometryDrawing Brush="#00FFFFFF" Geometry="F1M16,16L0,16 0,0 16,0z" />
                                <GeometryDrawing Brush="#FFF6F6F6" Geometry="F1M16,8C16,12.411 12.411,16 8,16 3.589,16 0,12.411 0,8 0,6.597 0.384,5.212 1.088,4L0,4 0,0 8,0 8,8 4,8C4,10.206 5.794,12 8,12 10.206,12 12,10.206 12,8 12,6.656 11.331,5.41 10.21,4.666L9.377,4.112 11.592,0.78 12.425,1.333C14.663,2.822,16,5.314,16,8" />
                                <GeometryDrawing Brush="#FF424242" Geometry="F1M15,8C15,11.859 11.859,15 8,15 4.14,15 1,11.859 1,8 1,6.076 1.801,4.292 3.121,3L1,3 1,1 7,1 7,7 5,7 5,4.002C3.766,4.931 3,6.401 3,8 3,10.757 5.243,13 8,13 10.757,13 13,10.757 13,8 13,6.321 12.164,4.763 10.764,3.833L11.871,2.167C13.83,3.469,15,5.649,15,8" />
                              </DrawingGroup.Children>
                            </DrawingGroup>
                          </DrawingBrush.Drawing>
                        </DrawingBrush>
                      </Rectangle.Fill>
                    </Rectangle>
                  </Viewbox>
                </Setter.Value>
              </Setter>
            </Trigger>
          </Style.Triggers>

        </Style>
      </Button.Style>

    </Button>

    <CheckBox x:Name="cb" Content="Enabled" Grid.Column="1"/>

  </Grid>
</Window>
person Phil Jollans    schedule 27.02.2019
comment
Отличная работа по заполнению пробелов. Спасибо. Я использовал конвертер для Visibility, чтобы скрыть его от просмотра, но это гораздо больше соответствует тому, как пользовательский интерфейс работает в другом месте. - person JoeHz; 28.02.2019
comment
Еще один момент: если стиль повторно используется для нескольких кнопок, содержимое должно предоставляться через DataTemplates, чтобы они создавали новую копию визуального дерева содержимого для каждой кнопки. В противном случае то, что есть в сеттере, является единственной копией, и вторая созданная кнопка украдет ее у первой. - person 15ee8f99-57ff-4f92-890c-b56153; 28.02.2019

Вы можете использовать Triggers для установки Content на основе значения свойства IsEnabled.

<Button Command="{Binding RefreshCommand}">
    <Button.Style>
        <Style TargetType="Button">
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="True">
                    <Setter Property="Content">
                        <Setter.Value>
                            <!--Your drawing / image when it's enabled-->
                        </Setter.Value>
                    </Setter>
                </Trigger>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Content">
                        <Setter.Value>
                            <!--Your drawing / image when it's disabled-->
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>
person dhilmathy    schedule 27.02.2019