WPF中使用Setter的EventTrigger是什么?

17

我在WPF窗口中有一个普通的按钮和文本框,并且我希望为该按钮创建一个模板,其中包含一个EventTrigger,该EventTrigger监听Button.Click事件,然后设置文本框的布尔属性。不使用代码后台实现。

类似于以下内容:

<ControlTemplate.Triggers>
  <EventTrigger SourceName="MyButton" RoutedEvent="Button.Click">
    <Setter TargetName="MyTextBox" Property="Focusable" Value="False" />
  </EventTrigger>
2个回答

18

这是一个示例,它通过EventTrigger设置和清除TextBox的Focusable属性。
希望您能将此示例调整到您的情况。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <TextBox 
        x:Name="tb"
        Grid.Row="0"
        Text="Here is some sample text">
    </TextBox>
    <Button 
        x:Name="btnFocusTrue"
        Grid.Row="1"
        Content="Set True">
    </Button>
    <Button 
        x:Name="btnFocusFalse"
        Grid.Row="2"
        Content="Set False">
    </Button>
    <Grid.Triggers>
        <EventTrigger RoutedEvent="Button.Click" SourceName="btnFocusTrue">
            <BeginStoryboard Name="FocusTrueStoryboard">
                <Storyboard >
                    <BooleanAnimationUsingKeyFrames
                        Storyboard.TargetName="tb"
                        Storyboard.TargetProperty="(TextBox.Focusable)">
                        <DiscreteBooleanKeyFrame
                            KeyTime="00:00:01"
                            Value="True" />
                    </BooleanAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="Button.Click" SourceName="btnFocusFalse">
            <BeginStoryboard Name="FoucsFalseStoryboard">
                <Storyboard >
                    <BooleanAnimationUsingKeyFrames
                        Storyboard.TargetName="tb"
                        Storyboard.TargetProperty="(TextBox.Focusable)">
                        <DiscreteBooleanKeyFrame
                            KeyTime="00:00:01"
                            Value="False" />
                    </BooleanAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Grid.Triggers>
</Grid>

2
啊,错过了离散*关键帧类...虽然这是解决我的问题的方法,但对于这样一个简单的任务来说,需要大量的XAML...我希望有一个更短的版本。 - Andreas Zita
1
我们如何在事件触发器中设置自定义依赖属性的值? - Ujjwal27

0

您可以利用行为来实现您想要的结果: 首先,添加引用:

xmlns:b="http://schemas.microsoft.com/xaml/behaviors"

接下来,您可以使用交互触发器和ChangePropertyAction为所选属性分配值:

<Button>
    <b:Interaction.Triggers>
        <b:EventTrigger EventName="Click">
            <b:ChangePropertyAction PropertyName="Focusable" Value="False"/>
        </b:EventTrigger>
    </b:Interaction.Triggers>
</Button>

你也可以通过指定TargetObject来更改DataContext中的属性,方法如下:

<b:ChangePropertyAction TargetObject="{Binding MemberOfYourDataContext}" PropertyName="PropertyOfYourDataContextMember" Value="StaticValueOrBinding"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接