2010-10-29 143 views
2

我在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

回答

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 2010-11-09 07:57:29

0

這是把我的頭頂部,但如果移動「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