Проблема с использованием делегатов, статических и зависимых свойств - PullRequest
1 голос
/ 31 марта 2010

Я пытаюсь анимировать приватную переменную с именем radius, которая работает. Однако во время его изменения я пытаюсь выполнить функцию, которая становится довольно сложной.

код, который у меня есть, приведен ниже, он не запустится, так как содержит следующую ошибку Ссылка на объект требуется для нестатического поля, метода или свойства AppPart.SetChildrenPosition () '

в частности, новый SetChildrenPositionDelegate (SetChildrenPosition) эта часть в этом послании part.Dispatcher.BeginInvoke (new SetChildrenPositionDelegate (SetChildrenPosition), new Object ());

Спасибо любому, кто сможет мне помочь.

class AppPart : Shape
{
    public string name
    { get; set; }

    public List<AppPart> parts
    { get; set; }

    private double radius
    {
        get { return (double)GetValue(radiusProperty); }
        set { SetValue(radiusProperty, value); }
    }
    public static readonly DependencyProperty radiusProperty = DependencyProperty.Register(
            "radius",
            typeof(double),
            typeof(AppPart),
            new PropertyMetadata(
            new PropertyChangedCallback(radiusChangedCallback)));



    private delegate void SetChildrenPositionDelegate();

    private void SetChildrenPosition()
    {
        //do something with radius
    }

    private static void radiusChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        AppPart part = d as AppPart;
        part.Dispatcher.BeginInvoke(new SetChildrenPositionDelegate(SetChildrenPosition), new Object());
    }

    private void AnimateRadius(double start, double end)
    {
        DoubleAnimation ani = new DoubleAnimation();
        ani.From = start;
        ani.To = end;
        ani.FillBehavior = FillBehavior.HoldEnd;
        ani.Duration = new Duration(new TimeSpan(0, 0, 0, 3, 0));
        ani.Completed += delegate
        {
            Console.WriteLine("ani ended");
        };
        this.BeginAnimation(AppPart.radiusProperty, ani);
    }
}

Ответы [ 2 ]

1 голос
/ 31 марта 2010

Попробуйте: part.Dispatcher.BeginInvoke(() => part.SetChildrenPosition()));

1 голос
/ 31 марта 2010

Конечно - вам просто нужно дать делегату цель. Я бы лично разделил это так:

AppPart part = d as AppPart;
// This creates a delegate instance associated with "part" - so it will
// effectively call part.SetChildrenPosition() accordingly
SetChildrenPositionDelegate action = part.SetChildrenPosition;
part.Dispatcher.BeginInvoke(action, new Object());

(Кстати, вам нужна часть new Object()?)

...