自定义控件中的故事板

问题描述:

我在Silverlight中有一个用户控件,我试图将其转换为自定义控件。 usercontrol正在工作。 customcontrol正在工作,但它的故事板不工作。自定义控件中的故事板

控制是:

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()没有错误;但是我不能看到动画...

是否有人有想法?如何与故事板一起工作?

预先感谢任何帮助

编辑:完整的源样本可用:http://vpclip.virtua-peanuts.net/WindowsPhoneApplication1.zip

+0

您能提供完整的源代码吗?包括你的generic.xaml文件。 – 2010-11-03 12:23:52

如果在按钮点击处理程序中将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 2010-11-09 07:57:29

这是把我的头顶部,但如果移动“base.OnApplyTemplate()会发生什么; “作为OnApplyTemplate()函数中的第一行?

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

这有帮助吗?

+0

感谢您的回答,但同样的想法。 请注意,我正在使用WP7,也许这件事... – Tim 2010-10-29 13:56:28

+0

我不*认为* WP7应该会影响它。我很好奇,我发现你正在将_layoutRoot Visible首先变为... layoutRoot内的故事板?如果是这样,可能是计时问题 - 请尝试将其初始显示,然后查看故事板是否以此方式进行测试。另外,您无法添加使layoutRoot作为故事板的一部分可见的任何原因? (当然不是问题的一部分,但只是想知道)。 – 2010-10-29 14:33:53

+0

我已经尝试了你的建议,并把真实可见,但nohihng更好。 我的项目可以在这里找到:http://vpclip.virtua-peanuts.net/WindowsPhoneApplication1.zip 也许你可以关注它。 感谢您的帮助 – Tim 2010-11-02 12:27:21