Мы используем Attached Properties для управления пользовательскими изменениями состояния элементов.Затем они просто привязываются к модели представления.
Например, для настройки «разделенного экрана» мы делаем следующее.
Создаем свойство DependancyProperty в классе с именем SplitScreen со свойствомназываемый режим:
public class SplitScreen
{
public static readonly DependencyProperty ModeProperty =
DependencyProperty.Register("Mode",
typeof(SplitScreenMode),
typeof(UserControl),
new PropertyMetadata(SplitScreenMode.None,
new PropertyChangedCallback(OnScreenModeChanged)));
public static void SetMode(DependencyObject obj, SplitScreenMode value)
{
obj.SetValue(ModeProperty, value);
}
public static SplitScreenMode GetMode(Control obj)
{
return (SplitScreenMode)obj.GetValue(ModeProperty);
}
static void OnScreenModeChanged(object sender, DependencyPropertyChangedEventArgs args)
{
var control = sender as UserControl;
if (control != null)
{
if (control.Parent == null)
{
control.Loaded += (s, e) =>
{
ApplyCurrentState(control);
};
}
else
{
ApplyCurrentState(control);
}
}
}
[snip]
}
Вы могли бы заметить наш маленький трюк с позднее обновление значение, когда изначально установлено Attached Property (часто родительский элемент отсутствует, пока страница не будетполностью загружен).
В файле Xaml присоедините свойство к необходимому элементу следующим образом:
lib:SplitScreen.Mode="{Binding SplitScreenMode}"
Ключ заключается в том, чтобы отследить изменения свойства зависимости и получитьчтобы изменить визуальное состояние прикрепленного элемента (это фрагмент файла SplitScreen.cs):
static public void ApplyCurrentState(Control control)
{
string targetState;
switch (GetMode(control))
{
case SplitScreenMode.Single:
targetState = SplitScreenModeName.Single;
break;
case SplitScreenMode.Dual:
targetState = SplitScreenModeName.Dual;
break;
default:
targetState = SplitScreenModeName.None;
break;
}
VisualStateManager.GoToState(control, targetState, true);
}
Альтернативой является установка Expression Blend SDK Вы не делаетенужен Expression Blend, чтобы использовать SDK и все классные дополнения.Это намного меньше работы для простых предметов (нам просто нужно было некоторое нестандартное поведение, которое он не поддерживал).