禁用时更改按钮的样式 ( IsEnabled=False )

Change style of a Button when its Disabled ( IsEnabled=False )

我有一个 UWP 问题。如何在禁用按钮 (IsEnabled=False) 时更改按钮的样式?

这是您的操作方法。

<StackPanel>

    <Button x:Name="button" Content="Click Me" 
            IsEnabled="{Binding IsChecked, ElementName=checkBox}">
        <Interactivity:Interaction.Behaviors>

            <Core:DataTriggerBehavior Binding="{Binding IsEnabled,
                ElementName=button, Mode=OneWay}" Value="True">
                <Core:ChangePropertyAction PropertyName="Opacity" Value="1"/>
            </Core:DataTriggerBehavior>

            <Core:DataTriggerBehavior Binding="{Binding IsEnabled, 
                ElementName=button, Mode=OneWay}" Value="False">
                <Core:ChangePropertyAction PropertyName="Opacity" Value=".5"/>
            </Core:DataTriggerBehavior>

        </Interactivity:Interaction.Behaviors>
    </Button>

    <CheckBox x:Name="checkBox" IsChecked="True" />

</StackPanel>

别忘了您需要引用 Behaviors SDK。

祝你好运!

Microsoft 将 VisualStateManager(来自 Silverlight)添加到 Windows 通用平台。它的目的是处理不同状态下控件的外观。按钮的 "Disabled" 状态就是一个很好的例子。控件的视觉状态在其 ControlTemplate 中定义。要自定义这些状态,最简单的方法是右键单击设计器中的按钮并选择 "Edit Template",然后选择 "Edit a Copy..."。

这样做是将该控件的默认模板复制到 selected 位置。 如果控件是 Button,您将拥有这样的样式资源:

<Style x:Key="MyButtonStyle" TargetType="Button">
        <Setter Property="Background" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}"/>
        <Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseHighBrush}"/>
        <Setter Property="BorderBrush" Value="{ThemeResource SystemControlForegroundTransparentBrush}"/>
        <Setter Property="BorderThickness" Value="{ThemeResource ButtonBorderThemeThickness}"/>
        <Setter Property="Padding" Value="8,4,8,4"/>
        <Setter Property="HorizontalAlignment" Value="Left"/>
        <Setter Property="VerticalAlignment" Value="Center"/>
        <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}"/>
        <Setter Property="FontWeight" Value="Normal"/>
        <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}"/>
        <Setter Property="UseSystemFocusVisuals" Value="True"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid x:Name="RootGrid" Background="{TemplateBinding Background}">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal"/>
                                <VisualState x:Name="PointerOver">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ContentPresenter">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightBaseMediumLowBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightBaseHighBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="RootGrid">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundBaseMediumLowBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ContentPresenter">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightTransparentBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightBaseHighBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                        <PointerDownThemeAnimation Storyboard.TargetName="RootGrid"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Disabled">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="RootGrid">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseLowBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ContentPresenter">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledTransparentBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <ContentPresenter x:Name="ContentPresenter" AutomationProperties.AccessibilityView="Raw" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" ContentTemplate="{TemplateBinding ContentTemplate}" ContentTransitions="{TemplateBinding ContentTransitions}" Content="{TemplateBinding Content}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

现在您可以看到 Button 和与之关联的 setters/animations 的视觉状态。您可以手动修改它们,也可以打开 Microsoft Blend 2015。它具有设计视觉状态的强大功能。右键单击您的按钮并在 Blend 中单击 "Edit Template"->"Edit Current",您可以在状态选项卡(左侧)上看到您的控件具有的所有状态。

当您 select 处于 "Disabled" 状态时,您会在设计器周围看到红色边框 window。左上角的文字告诉您 "Disabled state recording is on..."。这意味着对控件树中对象的每次更改都会对控件的 "Disabled" 状态进行更改。例如,您可以为禁用状态更改 Contentpresenter 的前景色。以下动画将添加到您的 XAML:

                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <SolidColorBrush Color="#FF225EFF"/>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>

有关 VisualSateManager 的更多信息以及从哪里开始,请查看 New XAML Tools in Visual Studio 2015 and Blend Video on Channel9

希望对您有所帮助