我有一个ListBox,它使用自定义控件作为ListBox.ItemTemplate DataTemplate。
我想我的第一个问题(其余是相关的)是如何为列表框中的孩子创建唯一的名称?
我问,因为我试图从代码隐藏中调用ListBox.Resource Storyboard。我得到的错误是找不到MyShadow。
<MyControl.BitmapEffect>
<DropShadowBitmapEffect x:Name="MyShadow" ShadowDepth="5" Opacity="0.5" Softness="0.5" />
</MyControl.BitmapEffect>
我的xaml故事板是
<Storyboard x:Key="FocusedShadow">
<!-- Shadow Animation-->
<DoubleAnimation
Storyboard.TargetName="MyShadow"
Storyboard.TargetProperty="ShadowDepth"
To="15"
Duration="0:0:.14" />
</Storyboard>
我认为我需要做的是将Targetname指定为项目的名称(回到第一个问题),TargetProperty应该是MyShadow.Shadowdepth,但我不知道如何从这里到达那里。
在代码中我正在做一个storyboardobject.begin(this);
TIA
答案 0 :(得分:0)
我有一个非常类似的问题。基本上,(我在想)你在完全创建视觉树之前尝试动画。我用两种技术解决了这个问题。
首先,我使用优先级Dispatcher.BeginInvoke(...
在ApplicationIdle
内部提升我的动画事件(在我的xaml中触发Trigger)(这样我们很确定视觉树已经被在我举起活动之前,我打电话给UpdateLayout()
。
第二,我正在访问该对象,如下所示:var child = this.GetTemplatedChild("MyCanvas")
以确保在尝试引发事件之前画布实际存在。 (不太确定这会有所帮助,但是在我添加之后,例外消失了)
这是我的示例代码:
this.Dispatcher.BeginInvoke(new Action(() =>
{
this.UpdateLayout();
if (this.Visibility == System.Windows.Visibility.Visible)
{
var bzyCanvas = this.GetTemplateChild("BusyCanvas");
if (bzyCanvas != null)
this.RaiseEvent(new RoutedEventArgs(AnimationStarted));
}
}),System.Windows.Threading.DispatcherPriority.ApplicationIdle);