2010-03-24 1 views
1

В обработчике события CompletedStoryboard, как получить элемент, к которому применяется раскадровка?Манипулирование целевого объекта раскадровки

Мой Раскадровка является частью 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 ... 
      } 
     } 
    } 
} 

[Примечание: этот код был продезинфицировать для публичного просмотра , извините за любые небольшие расхождения или синтаксические ошибки, которые вы можете заметить]

Смежные вопросы