Silverlight / WPF: DependencyProperty.AddOwner & Render при изменении - PullRequest
0 голосов
/ 15 июля 2011

Мне нужно реализовать линейку, и у меня есть CustomControl RangeSlider, который является производным от Control и имеет несколько свойств DependencyProperties (например, Minimum, Maximum, LowerValue, UpperValue).

public static readonly DependencyProperty LowerValueProperty =
  DependencyProperty.Register("LowerValue",
  typeof(double),
  typeof(RangeSlider),
  new FrameworkPropertyMetadata(0d, OnLowerValueChanged, CoerceLowerValue));

public double LowerValue
{
  get { return (double)base.GetValue(LowerValueProperty); }
  set { base.SetValue(LowerValueProperty, value); }
}

В Xaml линейка имеетScale подэлемента управления (полученный из Canvas), которому для рисования Scaling требуются те же свойства.Если LowerValue или UpperValue изменились, Scale должен перерисоваться.Поэтому я добавляю

public static readonly DependencyProperty LowerValueProperty =
  RangeSlider.LowerValueProperty.AddOwner(typeof(Scale), new FrameworkPropertyMetadata(1d));

Когда я перемещаю большой палец, что-то должно подниматься в масштабе.Сначала я реализовал OnRender (DrawingContext) и добавил к свойству LowerValueProperty в RangeSlider FrameworkPropertyMetadataOptions.Но это не имеет значения, ничего не происходит.Более того, я не хочу использовать OnRender (DrawingContext), потому что он не доступен в Silverlight.

Кроме того, мне интересно, почему вызывается OnLowerValueChanged-Method в RangeSlider, а не установщик LowerValue (по крайней мере, отладчик непрорваться туда).

Итак, есть ли способ для Silverlight и WPF автоматически вызывать метод в Scale, когда изменяется LowerValue в RangeSlider (кроме повышения из OnLowerValueChanged)?

Примечание.приведенный выше код является WPF-кодом.В Silverlight, конечно, есть некоторые различия, потому что Silverlight не поддерживает, среди прочего, Coercion.
Поскольку код должен работать в Silverlight и WPF, я не хочу использовать OnRender (DrawingContext).

1 Ответ

0 голосов
/ 15 июля 2011

Если я правильно понимаю, вы хотите иметь возможность выполнять некоторую логику в свойствах, которые являются просто обертками вокруг методов GetValue и SetValue. Проблема в том, что они используются только при создании XAML и указании привязок для этих свойств. За кулисами они больше никогда не называются, вместо этого используются GetValue и SetValue.

Вот почему я думаю (все еще не уверен, что четко понимаю вопрос), что вы должны либо использовать обработчики событий для ValueChanged события (например) внутри вашего элемента управления, и нет другого способа перехватывать вызовы GetValue & SetValue.

Или вы можете использовать PropertyChangedCallback с DependencyProperties, который вызывается после изменения DP и поместить туда свой код

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