Silverlight 自定义控件中的情节提要
我在silverlight中有一个usercontrol,我正试图将其转换为自定义控件。 用户控件正在工作。 customcontrol正在工作,但其情节提要不工作 控件为: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
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文件。哦,是的,这是发布的。。。谢谢你的帮助。是的,这是发行的。。。谢谢你的帮助。顺致敬意,