【问题标题】:Event Trigger not working on Storyboard事件触发器在情节提要上不起作用
【发布时间】:2013-01-20 06:58:59
【问题描述】:

我只是希望你能帮助填补我在 WPF 知识方面的空白。

(请原谅通用命名,不确定是否有帮助)

我有一个自定义对象 MyObject,它实现了 INotifyPropertyChanged。它有一个名为 MyCustomProperty 的属性,如下所示;

public int MyCustomProperty
{
 get { return this._myCustomProperty; }
 set
 {
  if (this._myCustomProperty == value)
    return;
  this._myCustomProperty= value;
  OnPropertyChanged("MyCustomProperty");
 }
}

这一切都有效。 在我的 WPF 应用程序中,我有这 3 个功能;

private void DoStuff()
{
   AddItemsToCanvas();
   ChangeValues();
}

private void AddItemsToCanvas()
{
   DataTemplate dt = (DataTemplate)FindResource("myDataTemplate");
   foreach (MyObject temp in ListOfMyObjects)
   {
     ContentControl cc = new ContentControl();
     cc.ContentTemplate = dt;
     cc.Content = temp;
     myCanvas.Children.Add(cc);
   }
}

private void ChangeValues()
{
  // this simply changes the MyCustomPropery in each of the objects
}

DataTemplate 看起来像这样;

<DataTemplate x:Key="myDataTemplate">
 <Canvas>
  <TextBlock Name="tb_debug" Text="{Binding Path=MyCustomProperty, NotifyOnTargetUpdated=True}">
   <TextBlock.Triggers>
    <EventTrigger RoutedEvent="Binding.TargetUpdated">
     <BeginStoryboard>
      <Storyboard>
       <DoubleAnimation Storyboard.TargetName="tb_debug" Storyboard.TargetProperty="(Canvas.Top)" From="0" To="350" Duration="0:0:1.6" />
      </Storyboard>
     </BeginStoryboard>
    </EventTrigger>
   </TextBlock.Triggers>
  </TextBlock>
 </Canvas>
</DataTemplate>

当 MyCustomProperty 更改时,它只是将文本框从画布的顶部移动到底部。

加载 UserControl 时,我同时调用 AddItemsToCanvas() 和 ChangeValues()。文本值更新并显示正确的值,但触发器不触发(即文本框不移动)。 在那之后的任何时候,当我调用 ChangeValues() 时,文本会更新并且文本框会移动。

为什么 EventTrigger 会在初始时间失败? 提前致谢

【问题讨论】:

  • 您能否提供一个小而完整的问题示例?然后尝试从零碎中找出问题会容易得多......
  • 我不确定我是否可以 - 这个 UserControl 有大约 3000 行代码,加上类本身也差不多。

标签: wpf inotifypropertychanged eventtrigger


【解决方案1】:

我不确定为什么 Binding.TargetUpdated 没有被调用,但它只能在已经设置的目标更新时调用,而不是在第一次设置时调用(可能)。

但是您可以在DataTremplate 中的TextBlock Loaded 上添加另一个EventTrigger,以确保它在UserControl 加载时触发。

例子:

<DataTemplate x:Key="myDataTemplate">
    <DataTemplate.Resources>
        <Storyboard x:Key="animation" >
            <DoubleAnimation Storyboard.TargetName="tb_debug" Storyboard.TargetProperty="(Canvas.Top)" From="0" To="350" Duration="0:0:1.6" />
        </Storyboard>
    </DataTemplate.Resources>
    <Canvas>
        <TextBlock Name="tb_debug" Text="{Binding Path=MyCustomProperty, NotifyOnTargetUpdated=True}">
           <TextBlock.Triggers>
            <EventTrigger RoutedEvent="Binding.TargetUpdated">
                <BeginStoryboard Storyboard="{StaticResource animation}" />
            </EventTrigger>
               <EventTrigger RoutedEvent="Loaded">
                <BeginStoryboard Storyboard="{StaticResource animation}" />
            </EventTrigger>
           </TextBlock.Triggers>
        </TextBlock>
    </Canvas>
</DataTemplate>

【讨论】:

  • 感谢您的解决方法,这很有效。我今天将进行更多测试,以尝试弄清楚第一个事件到底发生了什么。
  • 这些动画必须在 DataTemplate 中还是可以直接应用于 TextBlock 触发器?
猜你喜欢
  • 2012-06-22
  • 2012-04-27
  • 2012-07-08
  • 1970-01-01
  • 2015-08-27
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多