【问题标题】:How do I set my trigger so that it fires when an event occurs on a different control?如何设置我的触发器,以便在另一个控件上发生事件时触发它?
【发布时间】:2011-03-16 12:08:06
【问题描述】:

当单击窗口中其他位置的某个按钮时,我正在尝试执行元素的动画。

这是我尝试过的:

    <Border Grid.Column="0" BorderThickness="1" BorderBrush="Blue"
                CornerRadius="30" Margin="4">
            <Border.Triggers>
                <EventTrigger **SourceName="btnSearch"  RoutedEvent="UIElement.MouseUp"**>
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard TargetProperty="Opacity">
                                <DoubleAnimation From="0" To="1" Duration="0:0:2"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Border.Triggers>
            <ScrollViewer VerticalScrollBarVisibility="Auto">
                <ItemsControl x:Name="itmsSearch" ItemsSource="{Binding}" Padding="4"
                              ItemTemplate="{StaticResource SearchResultItemDT}">
                </ItemsControl>
            </ScrollViewer>
        </Border>

我的 EventTrigger 的属性似乎有错误的值,这会导致抛出异常,指出找不到名为 btnSearch 的元素。

上述按钮位于我窗口的其他位置:

    <StackPanel
        Height="30"
        Orientation="Horizontal"
        Margin="5">

        <TextBox
            x:Name="txtSearch"
            Width="650"
            FontFamily="Comic Sans MS"
            Foreground="Chocolate" />
        <Button
            x:Name="btnSearch"
            Width="100"
            Content="Go!"
            Click="BtnSearch_Click" />
    </StackPanel>

我只是假设将 SourceName 设置为所需按钮的名称就可以了。但它不起作用:(

【问题讨论】:

    标签: .net wpf xaml animation triggers


    【解决方案1】:

    尝试将StoryBoard.TargetName 属性设置为要设置动画的元素名称。您已经设置了StoryBoard.TargetProperty。当TargetName 属性未设置时,它假定为当前元素。

    您不需要设置SourceName

    示例:

    <Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
        <Grid.Triggers>
            <EventTrigger  RoutedEvent="Grid.Loaded">
                <BeginStoryboard>
                    <Storyboard TargetName="jim2" TargetProperty="Opacity">
                        <DoubleAnimation From="1" To="0" Duration="0:0:4" 
    AutoReverse="True" RepeatBehavior="Forever"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Grid.Triggers>
        <Image Name="jim1" Source="jim1.gif"/>
        <Image Name="jim2" Source="jim2.gif"/>
    </Grid>
    

    【讨论】:

    • 我尝试设置 TargetName="btnSearch",但没有做任何事情......没有响应。即便如此,我认为这听起来有点倒退?如问题所示,我的触发器位于 Border 元素中,因此我不必设置 TargetName ... Border 本身就是目标。我希望在触发按钮的 Click 事件时发生 Border 中指定的动画。
    • 另外,我尝试将触发器移动到我的 Button 元素中(所以现在它是 ,然后我尝试将 TargetName 设置为我的 Border 元素的名称......我仍然得到“未找到该名称的元素”异常。
    • 哇!好吧,你是对的。我在之前的评论中发布的内容有效。只是我将整个内容部分指定为资源。当我将它移到我的实际元素内容时,它起作用了。谢谢!
    【解决方案2】:

    您可以使用 visualstatemanager 来制作动画(将 vsm 添加到应该动画的控件(或任何父级)中)。您可以在按钮的单击处理程序中启动动画。

    VisualStateManager.GoToElementState(this.myControlToAnimate, "MyAnimationState", true)
    

    【讨论】:

    • 难道没有办法在 XAML 中做我想做的事吗?
    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2016-02-22
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多