自定义控件中的故事板
我在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
如果在按钮点击处理程序中将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); }
}
}
哦,是的,这是发出......感谢您的帮助。最好的祝福 – 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;
}
这有帮助吗?
感谢您的回答,但同样的想法。 请注意,我正在使用WP7,也许这件事... – Tim 2010-10-29 13:56:28
我不*认为* WP7应该会影响它。我很好奇,我发现你正在将_layoutRoot Visible首先变为... layoutRoot内的故事板?如果是这样,可能是计时问题 - 请尝试将其初始显示,然后查看故事板是否以此方式进行测试。另外,您无法添加使layoutRoot作为故事板的一部分可见的任何原因? (当然不是问题的一部分,但只是想知道)。 – 2010-10-29 14:33:53
我已经尝试了你的建议,并把真实可见,但nohihng更好。 我的项目可以在这里找到:http://vpclip.virtua-peanuts.net/WindowsPhoneApplication1.zip 也许你可以关注它。 感谢您的帮助 – Tim 2010-11-02 12:27:21
您能提供完整的源代码吗?包括你的generic.xaml文件。 – 2010-11-03 12:23:52