【问题标题】:Change style of a Button when its Disabled ( IsEnabled=False )禁用时更改按钮的样式( IsEnabled=False )
【发布时间】:2015-10-04 21:21:34
【问题描述】:

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

【问题讨论】:

    标签: winrt-xaml windows-10 windows-10-mobile


    【解决方案1】:

    Microsoft 将VisualStateManager(来自 Silverlight)添加到 Windows 通用平台。其目的是为不同状态处理控件的外观。按钮的“禁用”状态就是一个很好的例子。控件的视觉状态在其 ControlTemplate 中定义。要自定义这些状态,最简单的方法是右键单击设计器中的按钮并选择“编辑模板”,然后选择“编辑副本...”。

    它的作用是将该控件的默认模板复制到选定的位置。 如果控件是 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 的视觉状态以及与之关联的设置器/动画。您可以手动修改它们,也可以打开 Microsoft Blend 2015。它具有强大的视觉状态设计功能。右键单击您的按钮,然后在 Blend 中单击“编辑模板”->“编辑当前”,您可以在状态选项卡(左侧)上看到您的控件具有的所有状态。

    当您选择“禁用”状态时,您会看到设计器窗口周围有一个红色边框。左上角的文字告诉您“已禁用状态记录...”。这意味着对控件树中对象的每次更改都会使控件的“禁用”状态。例如,您可以将 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

    希望对你有帮助

    【讨论】:

    • Tnx...对我帮助很大。
    【解决方案2】:

    这就是你的做法。

    <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。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2013-03-31
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多