【问题标题】:WPF - DataTrigger animation doesn't workWPF - DataTrigger 动画不起作用
【发布时间】:2013-09-24 09:42:55
【问题描述】:

所以我试图在从 ItemsControl 删除项目期间制作一些动画,该项目附加到 ObservableCollectio<Item> 我知道我不能在卸载事件中执行此操作,因为执行任何动画都为时已晚,因此我尝试使用 DataTrigger

执行此操作

我的xaml 文件如下所示:

 <DataTemplate DataType="{x:Type MyApp:Item}">
        <Border x:Name="ItemBorder">
            <Label Content="{Binding Path=Name}" />
        </Border>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=Removing}" Value="True">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Duration="0:0:1" From="1.0" To="0.0"
                                           Storyboard.TargetProperty="(Border.Opacity)" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
            </DataTrigger>
        </DataTemplate.Triggers>
</DataTemplate>

而我的Item 课程很简单:

public class Item : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    private bool removing;
    public bool Removing {
        get
        {
            return removing;
        }
        set
        {
            removing = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Removing"));
        }
    }

    // same with `Name` property
}

我想通过设置item.Removing = true 来启动动画,但没有任何反应。

我做错了什么?

【问题讨论】:

  • Storyboard.TargetName在哪里?

标签: c# wpf animation datatrigger


【解决方案1】:

您必须按如下方式更新您的动画,即给出元素名称:

              <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Removing}" Value="True">
                            <DataTrigger.EnterActions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation Duration="0:0:1" From="1.0" To="0.0"
                                           Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ItemBorder" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.EnterActions>

                        </DataTrigger>
             </DataTemplate.Triggers>

尝试将动画直接放在您的边框样式上,如下所示:

<DataTemplate DataType="{x:Type MyApp:Item}">
    <Border x:Name="ItemBorder">
        <Label Content="{Binding Path=Name}" />
        <Border.Style>
           <Style TargetType="Border">
              <Style.Triggers>
                 <DataTrigger Binding="{Binding Path=Removing}" Value="True">
                    <DataTrigger.EnterActions>
                      <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Duration="0:0:1" From="1.0" To="0.0"
                                           Storyboard.TargetProperty="Opacity" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
            </DataTrigger> 
          <Style.Triggers>
        </Style>         
</DataTemplate>

【讨论】:

  • 兄弟,我最后试过了,它工作得很好......你能检查一下你是否在输出窗口中遇到任何绑定错误......如果没有,你能发布你的完整 xaml 代码吗?
  • 好吧,我的错 - 它现在工作正常,但我在 Border.Style 中设置了 Binding 用于另一个目的,我不知道如何将这两者结合在一起 - 它说 The property Style is set more than once
  • 你能分享你的代码吗..它将帮助我更好地理解它
  • 它看起来很像上面的代码,但Border.Style 中还有一行:&lt;Binding Path="Status" Mode="OneWay" Converter="{StaticResource StyleConverter}" /&gt;,我想把它留在那里
  • 所以你的转换器将返回一些样式 rt 的实例?您可以将我们编写的触发器移动到该 style.triggers 中。它会起作用
猜你喜欢
  • 2021-11-14
  • 2015-04-30
  • 2014-09-09
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 2019-02-19
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多