Silverlight 自定义控件中的情节提要

Silverlight 自定义控件中的情节提要,silverlight,windows-phone-7,custom-controls,storyboard,Silverlight,Windows Phone 7,Custom Controls,Storyboard,我在silverlight中有一个usercontrol,我正试图将其转换为自定义控件。 用户控件正在工作。 customcontrol正在工作,但其情节提要不工作 控件为: public class MyControl : Control { public MyControl() { DefaultStyleKey = typeof(MyControl); } public static readonly DependencyProperty

我在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); }
    }
}
调试时,控制没有错误。_storyboard.Begin();,但是我看不到动画

有人有主意吗?如何使用故事板

提前谢谢你的帮助


编辑:完整的源代码示例可用:

这是我的想法,但是如果移动“base.OnApplyTemplate()”,会发生什么; “作为OnApplyTemplate()函数的第一行

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

这有帮助吗?

这是我的想法,但是如果移动“base.OnApplyTemplate()”,会发生什么; “作为OnApplyTemplate()函数的第一行

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

这有帮助吗?

如果在按钮单击处理程序中将IsBusy设置为true,您将看到动画确实有效。问题是在加载之前将其设置为true,因此_layoutRoot和_storyboard为null,动画永远不会开始

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); }
    }
}

如果在按钮单击处理程序中将IsBusy设置为true,则会看到动画确实有效。问题是在加载之前将其设置为true,因此_layoutRoot和_storyboard为null,动画永远不会开始

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); }
    }
}

谢谢你的回答,但我还是这么想。请注意,我正在使用WP7,也许这很重要……我认为WP7不应该影响它。我很好奇,我看到你先看到了_layoutRoot。。。故事板在layoutRoot中吗?如果是的话,这可能是一个时间问题——试着让它一开始就可见,然后看看情节提要是否以这种方式启动来测试它。还有,有什么原因不能添加以使layoutRoot作为情节提要的一部分可见?(当然不是问题的一部分,但只是想知道)。我已经尝试了你的建议,并将其付诸实施,但nohihng更好。我的项目可以在这里找到:也许你可以看看。谢谢你的帮助谢谢你的回答,但我还是这么想。请注意,我正在使用WP7,也许这很重要……我认为WP7不应该影响它。我很好奇,我看到你先看到了_layoutRoot。。。故事板在layoutRoot中吗?如果是的话,这可能是一个时间问题——试着让它一开始就可见,然后看看情节提要是否以这种方式启动来测试它。还有,有什么原因不能添加以使layoutRoot作为情节提要的一部分可见?(当然不是问题的一部分,但只是想知道)。我已经尝试了你的建议,并将其付诸实施,但nohihng更好。我的项目可以在这里找到:也许你可以看看。谢谢你的帮助。你能提供完整的来源吗?包括你的generic.xaml文件。你能提供完整的源代码吗?包括你的generic.xaml文件。哦,是的,这是发布的。。。谢谢你的帮助。是的,这是发行的。。。谢谢你的帮助。顺致敬意,