Смена иконки для неактивной кнопки

271
21 марта 2017, 10:35

Есть стиль для Button c шаблоном в виде иконки и текста, который применяется к нескольким кнопкам:

<Style x:Key="SimpleButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
             <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="Transparent">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <Image x:Name="Image" Grid.Row="0"
                               Source="{Binding RelativeSource={RelativeSource AncestorType={x:Type Button}}, Path=Tag}"
                               Width="16" Height="16" />
                        <TextBlock x:Name="TextBlock" Grid.Row="1" Text="{TemplateBinding Content}"
                                   Foreground="#5b5b5b" />
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="TextBlock" Property="Foreground" Value="#c0c0c0" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Когда кнопка неактивна нужно подставить серую иконку (у каждой кнопки, к которой применен стиль, она своя), поэтому я хотел применять стиль следующим образом:

<Button Content="Фильтры"
     Tag="/Resources/Icons/search/filters.png" >
    <Button.Style>
        <Style BasedOn="{StaticResource SimpleButtonStyle}" TargetType="{x:Type Button}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsStarted}" Value="True">
                    <Setter Property="IsEnabled" Value="False" />
                    <Setter Property="Tag" Value="/Resources/Icons/search/filters-disabled.png" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

То есть хотел менять свойство Tag, когда кнопка будет становится неактивной. Но такой подход не работает — иконка остается прежней.

Почему такой способ не срабатывает?

Answer 1

Вы устанавливаете Tag вручную, а меняете его через стиль. Так, к сожалению, работать не будет: значения, установленные вручную, всегда «сильнее» установленных через стиль, поэтому стиль не может из переопределить.

Устанавливайте начальное значение тоже через стиль.

<Button Content="Фильтры">
    <Button.Style>
        <Style BasedOn="{StaticResource SimpleButtonStyle}" TargetType="{x:Type Button}">
            <Setter Property="Tag" Value="/Resources/Icons/search/filters.png"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsStarted}" Value="True">
                    <Setter Property="IsEnabled" Value="False" />
                    <Setter Property="Tag" Value="/Resources/Icons/search/filters-disabled.png" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

Документация: https://msdn.microsoft.com/ru-ru/library/ms743230(v=vs.110).aspx

READ ALSO
Конвертирование из object в long

Конвертирование из object в long

Что я делаю не так:

366
Ошибка system.nullreferenceexception

Ошибка system.nullreferenceexception

Подскажите пожалуйста в чём ошибкаПытаюсь использовать рекурсивный метод на самодельном односвязном списке, но появляется ошибка System

330