C# 实现选项对话框

C# 实现选项对话框,c#,wpf,C#,Wpf,在我的应用程序中,如果转到菜单栏中的工具->选项,我希望实现一个与VisualStudios中类似的选项对话框。我该怎么做?我的第一个想法是使用页面和导航,但也许有一种更简单的方法?你应该创建一个新窗口并显示它,而不是创建一个页面并导航到它。然后你会在新窗口上调用.show,让它显示 然后,您可以将新窗口的外观更改为所需的外观,与编辑页面相同 如果将选项构建到与选项窗口结构匹配的完整对象模型中,那么最好的方法是使用MVVM工具包使用的任何导航感知UI绑定。选项窗口将作为一个新的根级别窗口开始,您

在我的应用程序中,如果转到菜单栏中的工具->选项,我希望实现一个与VisualStudios中类似的选项对话框。我该怎么做?我的第一个想法是使用页面和导航,但也许有一种更简单的方法?

你应该创建一个新窗口并显示它,而不是创建一个页面并导航到它。然后你会在新窗口上调用.show,让它显示

然后,您可以将新窗口的外观更改为所需的外观,与编辑页面相同


如果将选项构建到与选项窗口结构匹配的完整对象模型中,那么最好的方法是使用MVVM工具包使用的任何导航感知UI绑定。选项窗口将作为一个新的根级别窗口开始,您可以将选项数据模型的根绑定到该窗口

因此,简言之,将“选项”对话框视为一个小型应用程序,它使用与主MVVM应用程序相同的结构,但具有不同的数据模型根

如果您计划允许用户取消对选项的更改,则您希望您的选项数据模型是可克隆的,以便您可以使用克隆填充选项窗口,然后在用户在选项窗口上按“确定”时使用新数据交换实际选项。如果他们选择“取消”,您可以扔掉克隆对象并销毁窗口。

这可能不是最简单的方法,但我写的这个片段符合您的目标,这是一个很好的练习

在空的Windows窗体项目中,添加列表框listBox1和面板panel1。然后创建2个UserControls UserControl1和UserControl2,它们将是单击列表时显示的内容

在Form1类中,我们创建一个ListItem类,该类将包含如下菜单选项:

public partial class Form1 : Form
{
    public class ListItem
    {
        public string Text { get; set; }
        public UserControl Value { get; set; }

        public ListItem(string text, UserControl value)
        {
            Text = text;
            Value = value;
        }
    };

    ...

}
然后,在Form1中初始化Component之后,将项目添加到列表框:

public Form1()
{
    InitializeComponent();

    listBox1.DisplayMember = "Text";
    listBox1.ValueMember = "Value";
    listBox1.Items.Add(new ListItem("Item1", new UserControl1()));
    listBox1.Items.Add(new ListItem("Item2", new UserControl2()));
}
当您使用listBox1.SelectedItem时,它将返回一个对象,您可以将该对象强制转换为ListItem并访问关联的UserControl

要利用此行为,请转到设计模式并双击列表框,这将为SelectedIndexChanged事件添加代码。我们使用此事件在panel1中显示UserControl。这将清除所有旧面板内容并添加选定的UserControl:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    panel1.Controls.Clear();
    UserControl control = (listBox1.SelectedItem as ListItem).Value;
    if(control != null)
    {
        panel1.Controls.Add(control);
        control.Dock = DockStyle.Fill;
    }
}

我建议您尝试添加一个按钮或其他东西来区分用户控件和游戏。玩得开心

由于您使用的是WPF,您是否使用任何MVVM方法来构建应用程序?是的,我使用MVVM模式,用户应该能够取消更改。你说的……是什么意思。。。数据模型[…]作为内存中的表示形式存在。。。?我看到的唯一方法是深度复制整个数据模型,进行更改,并在用户接受更改时将其深度复制回来。更改最后部分的措辞以更清楚地了解我的意思。另一种方法是,如果您的选项以某种方式永久存储在数据库中,并根据需要重新读取。如果我实现IClonable,我必须在我的选项数据模型的每个自定义类型对象中实现它,对吗?因为我在数据模型中有很多自定义类型的对象和它们的集合,所以有没有一种简单的方法来克隆整个数据模型?如果不想编写实现IClonables的代码,可以使用AutoMapper,只需将每个对象映射到它自己就可以了。同时,我决定使用tabControl。但你的方法听起来不错。我会记住的。