Как связать свойство ControlTemplate Enabled с непрозрачностью в WPF XAML - PullRequest
2 голосов
/ 27 апреля 2009

В WPF внутри XAML, как расширить шаблон ControlTemplate таким образом, чтобы при применении к кнопке и отключению кнопки она становилась непрозрачной до 0,5 при отключении, а после включения - до 1,0 непрозрачности.

Этот визуальный эффект также должен работать, когда родитель отключен.

1 Ответ

8 голосов
/ 27 апреля 2009

Вам не нужен ControlTemplate для этого. Вы можете сделать это с помощью только стилей. Следующий стиль кнопки применяется ко всем кнопкам. Устанавливает непрозрачность на 0,5, когда IsEnabled равно true, и возвращает его на 1 автоматически, когда условие триггера больше не применяется. Если вы применяете ControlTemplate в стиле, вы можете добавить этот триггер к этому. Это также работает, когда родительский элемент отключен, поскольку IsEnabled наследуется.

<Window.Resources>
    <Style TargetType="{x:Type Button}">
        <Style.Triggers>
            <Trigger Property="Control.IsEnabled" Value="false">
                <Setter Property="Control.Opacity" Value="0.5" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

Или вам конкретно требовалось решение ControlTemplate?

Обновление

Я не думаю, что TemplateBinding поддерживает Converter, поэтому, если вы хотите сделать это в ControlTemplate, вам нужно использовать что-то вроде следующего оператора Binding достаточно высоко в логическом дереве.

Opacity={Binding Path=IsEnabled, 
         RelativeSource={RelativeSource TemplatedParent}, 
         Converter={StaticResource BoolToDoubleConverter}}

Где BoolToDoubleConverter - это IValueConverter, который возвращает 1 для true и 0.5 для false. Я все еще рекомендую подход стиля, если вы можете использовать стили. Гораздо проще, я верю.

...