在WPF中“菜单”UserControl中更改状态的最佳方法

时间:2010-12-30 06:53:33

标签: wpf expression-blend

我有一个UserControl,我希望有3种可能的状态:

-Main menu
-Config #1
-Config #2

(所有这三个都是具有各种按钮,文本框等的UserControl,并且父UserControl的状态将子控件设置为可见/不可见,具体取决于当前状态。)

主菜单状态具有进入2个配置状态之一的按钮(这两个状态都有'后退'按钮返回主菜单。)

实施此工作流程的“最简单”方法是什么?我是否需要手动查看更改并为每个按钮实现单击处理程序,更改父组件的状态? (我在Blend中这样做,所以我试图避免在VS之外编写C#代码。)

如果我目前的设计(UserControl w / states)使事情变得比它需要的更难,我会接受其他建议。 (这不是一个网页,只是一个常规应用程序,在主屏幕中有一些小屏幕导航+子屏幕导航。)

1 个答案:

答案 0 :(得分:0)

您可以在UserControl上创建枚举(公开这三个值)属性,并使用xaml触发器修改视图(请参见下面的示例)。
为了根据菜单状态更改状态,您可以将所有菜单项单击事件解决为一个处理程序(或一个命令),将相应的枚举作为命令参数或使用Tag属性传递,然后设置当前的CurrentState属性。 另一种方法是使用StoryBoard绕过各州。

示例(用UserControl替换Window,抱歉):

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>