Как создать свойство зависимости, которое получает значение из двух других свойств - PullRequest
2 голосов
/ 20 ноября 2010

Я делаю анимацию движущегося окна на рабочем столе.Я нашел где-то информацию, что лучший способ для этого - создать собственное свойство и анимировать его вместо Left и Top отдельно.

Проблема в том, что это свойство инициализируется значением (0, 0).Я хочу, чтобы мое свойство получало значение сверху и слева от моего окна и устанавливало его.

Мое свойство:

public static readonly DependencyProperty PositionProperty = DependencyProperty.Register("Position", typeof(Point), typeof(MainCard), 
        new PropertyMetadata(PositionPropertyChanged) );

private static void PositionPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs prop)
{
    MainCard mw = (MainCard)dependencyObject;
    Point value = (Point)prop.NewValue;

    mw.Top = value.Y;
    mw.Left = value.X;
}

public Point Position
{
    get
    {
        return (Point)GetValue(PositionProperty);
    }
    set
    {
        SetValue(PositionProperty, value);
    }
}

Ответы [ 2 ]

1 голос
/ 20 ноября 2010

Я не совсем понимаю, чего вы пытаетесь достичь, но ... вот мой взгляд на ваш вопрос:

  • во-первых, вы не можете поставить значение "по умолчанию" для вашегоСвойство для верхних / левых значений ваших окон, так как оно известно только при рутировании, тогда как значение «по умолчанию» для свойства должно быть предоставлено во время компиляции.
  • так что в основном то, что у вас естьto to - установить значение вашего свойства правильно, когда оно у вас есть (например, в методе show () вашего окна) следующим образом:

    myMainCard.SetCurrentValue (MainCard.PositionProperty, new Point () {X = myWindow.Left, Y = myWindow.Top});

1 голос
/ 20 ноября 2010

Извлечение MultiBinding и IMultiValueConverter . Это позволит вам привязать два исходных свойства и преобразовать их в одно значение для вашей позиции.


РЕДАКТИРОВАТЬ: Похоже, что вы действительно хотите здесь сделать, это анимировать точку, а не разделять значения слева и сверху, поэтому это, вероятно, не относится к вашему случаю. Настоящая проблема здесь в том, что у вас есть двусторонняя проблема; это свойство представляет ту же информацию, что и Top и Left, поэтому, если вы измените его, то Top и Left должны измениться. Точно так же, поскольку Top и Left являются изменяемыми, если они изменяются, вы действительно хотите, чтобы ваша собственность отражала это.

Один из вариантов - зарегистрировать обработчик измененных свойств для LeftProperty и TopProperty. Теперь, когда они изменятся, обновите свой PositionProperty. Вы должны быть осторожны, чтобы не вызывать повторные обновления (я меняю Left, который меняет Position, который меняет Left, который ...)

...