ListBox Dropshadow Анимация - PullRequest
       15

ListBox Dropshadow Анимация

0 голосов
/ 11 ноября 2010

У меня есть ListBox, который использует пользовательский элемент управления в качестве ListBox.ItemTemplate DataTemplate.

Полагаю, мой первый вопрос (и остальные актуальны): как создать уникальные имена для детей в списке?

Я спрашиваю, потому что я пытаюсь вызвать раскадровку ListBox.Resource из codebehind. Я получаю ошибку в том, что 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>

Я думаю, что мне нужно указать имя цели в качестве имени элемента (относится к первому вопросу), а свойство TargetProperty должно быть MyShadow.Shadowdepth, но я не знаю, как туда добраться.

В коде я делаю storyboardobject.begin (this);

ТИА

1 Ответ

0 голосов
/ 11 ноября 2010

У меня была очень похожая проблема.в основном, (я думаю), что вы пытаетесь оживить до того, как визуальное дерево будет полностью создано.Я решил это, используя два метода.

Во-первых, я поднимаю свое одушевленное событие (которое запускает Триггер в моем xaml) внутри Dispatcher.BeginInvoke(...), используя приоритет ApplicationIdle (таким образом, мыпочти уверен, что визуальное дерево было создано) также, я вызываю 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);
...