【问题标题】:3-state button behavior (default, pressed, disabled)三态按钮行为(默认、按下、禁用)
【发布时间】:2013-03-08 19:03:53
【问题描述】:

实现状态为 3 状态按钮的惯用方法(最好是最简单的方法)是什么:

  • 默认
  • 按下
  • 已禁用

到目前为止,我有这个:

<Button ToolTip="Back" FontWeight="Bold" Command="{Binding Path=Navigator.GoBackCommand}" IsEnabled="{Binding Path=Navigator.CanGoBack}">
  <Viewbox Width="10">
    <ContentControl Content="{StaticResource ResourceKey=CoolLeftArrow}"/>
  </Viewbox>
</Button>

是否需要更换控制模板才能获得这种行为,还是可以使用触发器获得?理想情况下,我只想指定 3 个不同的资源并将它们绑定到相关属性。

编辑:将名称“按下”状态更新为“按下”以避免与可能的类似复选框的行为混淆。

【问题讨论】:

    标签: wpf button triggers


    【解决方案1】:

    为什么不使用将IsThreeState 设置为true 的ToggleButton?

    <ToggleButton IsThreeState="True">
        <ToggleButton.Style>
            <Style TargetType="ToggleButton">
                <Style.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter Property="Content" Value="{StaticResource TbCheckedContent}"/>
                    </Trigger>
                    <Trigger Property="IsChecked" Value="False">
                        <Setter Property="Content" Value="{StaticResource TbUncheckedContent}"/>
                    </Trigger>
                    <Trigger Property="IsChecked" Value="{x:Null}">
                        <Setter Property="Content" Value="{StaticResource TbNullContent}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ToggleButton.Style>
    </ToggleButton>
    

    更新我想我没有仔细阅读你的问题。您当然可以对 Button 的 IsPressedIsEnabled 属性执行与上述类似的操作:

    <Button>
        <Button.Style>
            <Style TargetType="Button">
                <Style.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="Content" Value="{StaticResource ButtonPressedContent}"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="False">
                        <Setter Property="Content" Value="{StaticResource ButtonNormalContent}"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Content" Value="{StaticResource ButtonDisabledContent}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
    

    不过,您可以查看VisualStates,然后查看Button Styles and Templates,了解如何在按钮的 ControlTemplate 中可视化这些状态。

    【讨论】:

    • 是的,这就是切换的用途。您还可以为切换定义 ControlTemplate 以按照您想要的方式表示状态。
    • 完美的解决方案当然是具有适当定义的 VisualStates 的 ToggleButton ControlTemplate。有关 ToggleButton ControlTemplate 的示例,请参阅 ToggleButton Styles and Templates
    • 这不是像复选框那样工作吗?我特别需要一个具有默认外观的按钮,另一个“用户正在按下按钮”外观和第三个“按钮被禁用”外观。我不需要/想要选中/未选中的外观,因为它不应该像复选框一样工作。
    • 您可以查看Button Styles and Templates 中的 ControlTemplate 示例。它显示了 VisualStates NormalMouseOverPressedDisabled 是如何可视化的。
    • 谢谢克莱门斯,我会尽快试试你的答案!感谢您的努力。
    猜你喜欢
    • 2015-02-22
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多