2010-10-29 4 views
2

У меня есть usercontrol в silverlight, который я пытаюсь преобразовать в пользовательский элемент управления. Работает Usercontrol. Пользовательский контроль работает, но его раскадровка не работает.Раскадровка в пользовательском контроле

элемент управления:

public class MyControl : Control 
{ 
    public MyControl() 
    { 
     DefaultStyleKey = typeof(MyControl); 
    } 

    public static readonly DependencyProperty IsStartingProperty = DependencyProperty.Register("IsStarting", typeof(bool), typeof(MyControl), new PropertyMetadata(new PropertyChangedCallback(OnIsStartingChanged))); 

    private static void OnIsStartingChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     MyControl control = obj as MyControl; 
     if (control != null && control._layoutRoot != null && control._storyboard != null) 
     { 
      if ((bool)e.NewValue) 
      { 
       control._layoutRoot.Visibility = Visibility.Visible; 
       control._storyboard.Begin(); 
      } 
      else 
      { 
       control._layoutRoot.Visibility = Visibility.Collapsed; 
       control._storyboard.Stop(); 
      } 
     } 
    } 

    private Canvas _layoutRoot; 
    private Storyboard _storyboard; 

    public override void OnApplyTemplate() 
    { 
     _layoutRoot = GetTemplateChild("LayoutRoot") as Canvas; 
     _storyboard = GetTemplateChild("IndicatorStoryboard") as Storyboard; 
     base.OnApplyTemplate(); 
    } 

    public bool IsStarting 
    { 
     get { return (bool)GetValue(IsStartingProperty); } 
     set { SetValue(IsStartingProperty, value); } 
    } 
} 

На отлаживать, никакой ошибки на control._storyboard.Begin() ;, но я не могу увидеть анимацию ...

ли кто-то есть идея ? Как работать с раскадрой?

Заранее спасибо за любую помощь

EDIT: Полный образец источник доступен: http://vpclip.virtua-peanuts.net/WindowsPhoneApplication1.zip

+0

Не могли бы вы предоставить полный источник? Включая файл generic.xaml. –

ответ

0

Если вы установили IsBusy в true в обработчике кликов, вы увидите, что анимация работает. Проблема в том, что вы устанавливаете значение true перед загрузкой, поэтому _layoutRoot и _storyboard равны нулю, и анимация никогда не начинается.

public class CustomBusyControl : Control 
{ 
    public CustomBusyControl() 
    { 
     DefaultStyleKey = typeof(CustomBusyControl); 
     Loaded += (s,e) => ToggleBusy(this); 
    } 

    public static readonly DependencyProperty IsBusyProperty = DependencyProperty.Register("IsBusy", typeof(bool), typeof(CustomBusyControl), new PropertyMetadata(new PropertyChangedCallback(OnIsBusyChanged))); 

    private static void OnIsBusyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     ToggleBusy(obj as CustomBusyControl); 
    } 

    private static void ToggleBusy(CustomBusyControl control) 
    { 
     if (control != null && control._layoutRoot != null && control._storyboard != null) 
     { 
      if ((bool)control.IsBusy) 
      { 
       control._layoutRoot.Visibility = Visibility.Visible; 
       control._storyboard.Begin(); 
      } 
      else 
      { 
       control._layoutRoot.Visibility = Visibility.Collapsed; 
       control._storyboard.Stop(); 
      } 
     } 
    } 

    private Canvas _layoutRoot; 
    private Storyboard _storyboard; 

    public override void OnApplyTemplate() 
    { 
     _layoutRoot = GetTemplateChild("LayoutRoot") as Canvas; 
     Debug.Assert(_layoutRoot != null, "LayoutRoot is null"); 
     _storyboard = GetTemplateChild("IndicatorStoryboard") as Storyboard; 
     base.OnApplyTemplate(); 
    } 

    public bool IsBusy 
    { 
     get { return (bool)GetValue(IsBusyProperty); } 
     set { SetValue(IsBusyProperty, value); } 
    } 
} 
+0

о, да, это было выпущено ... спасибо за вашу помощь. С наилучшими пожеланиями – Tim

0

Это у верхней части моей головы, но что произойдет, если вы перемещаете «base.OnApplyTemplate(); "в качестве первой строки функции OnApplyTemplate()?

public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     _layoutRoot = GetTemplateChild("LayoutRoot") as Canvas; 
     _storyboard = GetTemplateChild("IndicatorStoryboard") as Storyboard; 
    } 

Помогло ли это?

+0

спасибо за ваш ответ, но то же самое думайте. Обратите внимание, что я использую WP7, возможно, имеет значение ... – Tim

+0

Я не * думаю * WP7 должен повлиять на него. Мне любопытно, я вижу, что вы сначала поворачиваете _layoutRoot Visible ... это раскадровка внутри layoutRoot? Если это так, может возникнуть проблема с синхронизацией - попробуйте оставить ее видимой на первый взгляд и посмотрите, срабатывает ли раскадровка, чтобы проверить ее. Кроме того, по какой-либо причине вы не можете добавить отображение layoutRoot как часть раскадровки? (Конечно, не вопрос, а просто интересно). –

+0

Я попробовал ваше предложение и поставил видимым, но ничего лучше. Мой проект можно найти здесь: http://vpclip.virtua-peanuts.net/WindowsPhoneApplication1.zip Возможно, вы можете иметь на это взгляд. Спасибо за вашу помощь – Tim

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