wpf 根据配置文件生成菜单(委托)以及左侧树节点,并且双击节点可以显示在文件里配置的界面
时间: 2024-04-29 17:24:05 浏览: 91
首先,我们需要一个配置文件来描述菜单和左侧树节点的结构,可以使用 XML 或者 JSON 格式来存储。例如,以下是一个简单的 XML 配置文件:
```xml
<menu>
<item name="File">
<item name="New">
<item name="Project" control="ProjectWindow"/>
<item name="File"/>
</item>
<item name="Open" control="OpenFileWindow"/>
<item name="Save" control="SaveFileWindow"/>
</item>
<item name="Edit">
<item name="Cut"/>
<item name="Copy"/>
<item name="Paste"/>
</item>
</menu>
```
其中,`menu` 标签表示整个菜单,`item` 标签表示一个菜单项,`name` 属性表示菜单项的名称,`control` 属性表示双击菜单项后要显示的界面。
接下来,我们可以编写一个委托方法来读取配置文件并生成菜单和左侧树节点。例如,以下是一个简单的委托方法:
```csharp
public delegate FrameworkElement CreateControlDelegate(string controlName);
public static void LoadMenuAndTree(string configFile, CreateControlDelegate createControl)
{
// 读取配置文件
XDocument doc = XDocument.Load(configFile);
XElement root = doc.Root;
// 生成菜单
Menu menu = new Menu();
GenerateMenuItems(root, menu.Items, createControl);
// 生成左侧树节点
TreeView tree = new TreeView();
GenerateTreeNodes(root, tree.Items, createControl);
// 将菜单和左侧树节点添加到界面中
// ...
}
private static void GenerateMenuItems(XElement element, ItemCollection items, CreateControlDelegate createControl)
{
foreach (XElement child in element.Elements("item"))
{
MenuItem menuItem = new MenuItem();
menuItem.Header = child.Attribute("name").Value;
XAttribute controlAttr = child.Attribute("control");
if (controlAttr != null)
{
menuItem.Click += (sender, e) =>
{
string controlName = controlAttr.Value;
FrameworkElement control = createControl(controlName);
// 显示界面
// ...
};
}
items.Add(menuItem);
GenerateMenuItems(child, menuItem.Items, createControl);
}
}
private static void GenerateTreeNodes(XElement element, ItemCollection items, CreateControlDelegate createControl)
{
foreach (XElement child in element.Elements("item"))
{
TreeViewItem treeNode = new TreeViewItem();
treeNode.Header = child.Attribute("name").Value;
XAttribute controlAttr = child.Attribute("control");
if (controlAttr != null)
{
treeNode.MouseDoubleClick += (sender, e) =>
{
string controlName = controlAttr.Value;
FrameworkElement control = createControl(controlName);
// 显示界面
// ...
};
}
items.Add(treeNode);
GenerateTreeNodes(child, treeNode.Items, createControl);
}
}
```
在委托方法中,我们首先读取配置文件,然后生成菜单和左侧树节点。对于菜单项和树节点,我们都可以通过递归方式来生成子项。对于双击菜单项或左侧树节点的操作,我们可以通过委托来生成对应的界面,并显示在窗口中。
最后,我们需要在界面中添加菜单和左侧树节点,例如:
```csharp
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
LoadMenuAndTree("config.xml", CreateControl);
}
private FrameworkElement CreateControl(string controlName)
{
// 根据控件名称生成对应的界面
// ...
}
}
```
阅读全文