2010-03-24 69 views
1

Completed事件Storyboard的处理程序中,如何获取故事板正在应用的元素?操作故事板的目标对象

我的故事板是一个ItemTemplate的一部分:

<ListBox x:Name="MyListBox" > 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid x:Name="Container" Height="30" > 
       <Grid.Resources> 
        <Storyboard x:Name="FadeOut" BeginTime="0:0:7" Completed="FadeOut_Completed"> 
         <DoubleAnimation From="1.0" To="0.0" Duration="0:0:3" Storyboard.TargetName="Container" Storyboard.TargetProperty="Opacity" /> 
        </Storyboard> 
       </Grid.Resources> 

       [...snip...] 

      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
Completed事件中,我想抓住电网

称为集装箱,这样我可以做坏事其DataContext的。这可以完成,还是我错误的方式?

谢谢:)

回答

2

这个问题的答案是,它是不可能的 - 而不是在Silverlight 3反正。

使用调试器时,我能够找到故事板的私有属性,当我走到对象树时,我得到了包含模板项目 - 但我无法通过代码使用反射来触及此代码Silverlight应用程序的限制(尽管在WPF中这可能是可能的)。

我最终的解决方案涉及使用Dictionary<Storyboard, Grid>和一些事件处理程序。通过模板,我附加了一个Loaded处理程序,这意味着每次创建并加载模板实例(即绑定到列表框的每个数据项)时,都会调用处理程序。在这一点上,我不得不模板的物理实例的引用,这样我就可以搜索其孩子的故事板:

private void ItemTemplate_Loaded(object sender, RoutedEventArgs e) 
{ 
    Storyboard s = getStoryBoard(sender); 
    if (s != null) 
    { 
     if (!_startedStoryboards.ContainsKey(s)) 
      _startedStoryboards.Add(s, (Grid)sender); 
    } 
} 

private Storyboard getStoryBoard(object container) 
{ 
    Grid g = container as Grid; 
    if (g != null) 
    { 
     if (g.Resources.Contains("FadeOut")) 
     { 
      Storyboard s = g.Resources["FadeOut"] as Storyboard; 
      return s; 
     } 
    } 
    return null; 
} 

private Dictionary<Storyboard, Grid> _startedStoryboards = new Dictionary<Storyboard, Grid>(); 

然后,当故事板的Completed事件被激发,我可以很容易地使用这本字典作为查找检索它内部托管项目模板,并从那里我能得到的项目模板的DataContext,做讨厌的东西我计划:

private void FadeOut_Completed(object sender, EventArgs e) 
{ 
    if (_startedStoryboards.ContainsKey((Storyboard)sender)) 
    { 
     Grid g = _startedStoryboards[(Storyboard)sender]; 
     if (g.DataContext != null) 
     { 
      MyDataItem z = g.DataContext as MyDataItem; 

      if (z != null) 
      { 
       ... do my thing ... 
      } 
     } 
    } 
} 

[注:此代码已经被消毒,供市民浏览,请原谅您可能会发现的任何小的差异或语法错误]