Search code examples
wpftemplatestriggerssetter

EventTrigger with Setter in WPF?


I have a normal Button and TextBox in a WPF-Window and I want a Template for the Button with a EventTrigger that listens to Button.Click and then sets a boolean-property of the TextBox. No code-behind.

Something like this:

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

Solution

  • Here is a sample that sets and clears Focusable on a TextBox from an EventTrigger.
    Hopefully you can adapt this example to your situation.

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