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