C# 在 xaml 中的按钮单击触发器上设置按钮内容

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18795896/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 13:14:01  来源:igfitidea点击:

Set button content on button click trigger in xaml

c#wpfxaml.net-4.0triggers

提问by inside

I would like to set button content using trigger in XAML without writing code behind:

我想在 XAML 中使用触发器设置按钮内容而无需编写代码:

Every time button is clicked, content should be changed: Something like button clicked first time, button content = "Hi", Second time clicked, button content = "Bye", Third time clicked, button content = "Hi" again.

每次点击按钮时,内容都应该改变:比如第一次点击按钮,按钮内容=“嗨”,第二次点击,按钮内容=“再见”,第三次点击,再次点击按钮内容=“嗨”。

    <Button x:Name="btn" Content="Hi">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <BeginStoryboard>
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.Target="{x:Reference btn}"
                                           Storyboard.TargetProperty="Content">
                            <DiscreteObjectKeyFrame KeyTime="0:0:0"
                                        Value="Bye"/>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
                <StopStoryboard>
                </StopStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>

So it works for setting button content once to Bye, but how to set it back to Hi on the next click ??

所以它可以将按钮内容设置为再见,但是如何在下次单击时将其设置回嗨?

I am also not sure if this is the most efficient way of setting the trigger, if you have better solution, feel free.

我也不确定这是否是设置触发器的最有效方法,如果您有更好的解决方案,请随意。

采纳答案by Benoit Catherinet

You want a button with two state, which seem exactly what a ToggleButton is. Here is a style changing the Content like you want:

你想要一个有两种状态的按钮,这看起来正是 ToggleButton 的样子。这是一种根据需要更改内容的样式:

<Style x:Key="ToggleButtonStyle1" TargetType="{x:Type ToggleButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                            <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="Button.IsDefaulted" Value="True">
                                <Setter Property="BorderBrush" TargetName="border" Value="Red"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" TargetName="border" Value="#FFBEE6FD"/>
                                <Setter Property="BorderBrush" TargetName="border" Value="#FF3C7FB1"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter Property="Background" TargetName="border" Value="#FFC4E5F6"/>
                                <Setter Property="BorderBrush" TargetName="border" Value="#FF2C628B"/>
                            </Trigger>
                            <Trigger Property="IsChecked" Value="True">
                                <Setter Property="Content" TargetName="contentPresenter" Value="Bye"/>

                            </Trigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="Background" TargetName="border" Value="#FFF4F4F4"/>
                                <Setter Property="BorderBrush" TargetName="border" Value="#FFADB2B5"/>
                                <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="#FF838383"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>