Лучший способ изменить состояния в UserControl «меню» в WPF - PullRequest
0 голосов
/ 30 декабря 2010

У меня есть UserControl, который я хочу иметь в трех возможных состояниях:

-Main menu
-Config #1
-Config #2

(Все три - это UserControl с различными кнопками, текстовыми полями и т. Д., А состояния родительского UserControl устанавливают дочерние элементы управления как видимые/ не отображается в зависимости от текущего состояния.)

Состояние главного меню имеет кнопки для перехода в любое из двух состояний конфигурации (и оба этих состояния имеют кнопку «назад» для возврата в главное меню).

Какой самый простой способ реализовать этот рабочий процесс?Нужно ли мне просматривать изменения вручную и реализовывать обработчик щелчков для каждой кнопки, изменяя состояние родительского компонента?(Я делаю это в Blend, поэтому я пытаюсь избежать написания кода C # вне VS.)

Если мой текущий дизайн (UserControl w / states) делает вещи сложнее, чем нужно,Я открыт для альтернативных предложений.(Это не веб-страница, а обычное приложение с небольшой навигацией по экрану + навигация по подэкрану на основных экранах.)

1 Ответ

0 голосов
/ 30 декабря 2010

Вы можете создать свойство enum (которое предоставляет эти три значения) в UserControl и использовать триггеры xaml для изменения представления (см. Пример ниже).
Чтобы изменить состояние в соответствии с состоянием меню, вы можете обратиться квсе события щелчка по элементам меню передаются одному обработчику (или одной команде), передавая соответствующее перечисление в качестве параметра команды или со свойством Tag, а затем устанавливают текущее свойство CurrentState.
Другим способом является использование StoryBoard для обхода состояний.

Пример (замените Window на UserControl, извините):

public partial class MainWindow : Window
{
  public MainWindow()
  {
    InitializeComponent();
  }

  public CurrentState CurrentState
  {
    get { return (CurrentState)GetValue(CurrentStateProperty); }
    set { SetValue(CurrentStateProperty, value); }
  }
  public static readonly DependencyProperty CurrentStateProperty =
    DependencyProperty.Register("CurrentState", typeof(CurrentState),
      typeof(MainWindow), new UIPropertyMetadata(CurrentState.MainMenu));    
}

public enum CurrentState
{
  MainMenu,
  Config1,
  Config2
}

Xaml:

<Window 
  x:Class="WpfApplication1.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:src="clr-namespace:WpfApplication1">
  <Window.Style>
    <Style TargetType="{x:Type src:MainWindow}">
      <Style.Triggers>
        <Trigger Property="CurrentState" Value="MainMenu">
          <Setter Property="Background" Value="Red" />
        </Trigger>
      </Style.Triggers>
    </Style>
  </Window.Style>
</Window>
...