Раскадровка в пользовательском управлении - PullRequest
2 голосов
/ 29 октября 2010

У меня есть пользовательский контроль в silverlight, который я пытаюсь преобразовать в пользовательский элемент управления.Пользовательский контроль работает.Пользовательский контроль работает, НО его раскадровка не работает.

элемент управления:

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

Ответы [ 2 ]

0 голосов
/ 08 ноября 2010

Если вы установите 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 голосов
/ 29 октября 2010

Это не в моей голове, но что произойдет, если вы переместите "base.OnApplyTemplate (); "как первая строка в функции OnApplyTemplate ()?

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

Это помогает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...