在 WPF 桌面应用程序中创建菜单和子菜单






3.90/5 (18投票s)
在本文中,我想为初学者介绍如何使用 WPF 对普通桌面应用程序进行编码和设计。
引言
最近我开始使用 WPF,发现关于普通桌面应用程序的信息不多。我想说,在 C# 中,如果你想开始一个桌面应用程序,你会选择 MDI(多文档界面),据我所知,WPF 中没有这样的选项。你可以添加 MDI 窗体,但那将是一个 Windows Forms 应用程序,而不是 WPF 应用程序。我的意思是它是“MDIParent.cs”文件,而不是“*.xaml”文件。
我使用 Visual Studio 2010 和 .Net 3.5 / 4.0 创建了这个项目。
背景
我正在编写一个图像处理应用程序,它将完全像 Windows Paint 应用程序一样运行。但在开始之前,我遇到了一个问题:如何在 WPF 中创建菜单!我在互联网上搜索了很多,也查阅了许多教程和 PDF,但我发现所有信息都可用,但组织方式杂乱无章。
所以我想,不如为初学者发布一篇文章。本文采用非常循序渐进的方法,所以即使你不下载源代码,只需按照步骤操作,你也会学到我在漫长的五天后所学到的知识。
使用代码
如果你做过 Windows Forms 开发,你会喜欢添加菜单项就像编写 HTML 一样简单。(当然,如果尖括号让你沮丧,总有设计师)。
<MenuItem>
类定义了一个菜单项,也就是说它们代表了菜单的可见部分。
现在开始。在普通的 WPF 窗口中,你会找到两个 xaml 文件:“App.xaml”和“MainWindow.xaml”。如果你双击 MainWindow.xaml 文件,一个简单的白色主窗口将出现。如果你打开 mainWindow.xaml,代码将如下所示
//
<Window x:Class="supertest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
</Grid>
</Window>
现在我们的目标是用菜单填充窗口。所以转到工具箱,选择“菜单”并将其拖放到主窗口。(如果你愿意,可以调整它的大小)。现在,你将立即看到 mainWindow.xaml 已经改变
//
<Window x:Class="supertest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Menu Height="27" HorizontalAlignment="Left" Name="menu1" VerticalAlignment="Top" Width="503" />
</Grid>
</Window>
现在菜单已创建,但菜单项缺失。在这里,我将指导你两种创建菜单项(如文件、编辑、视图、帮助等)的方法。
第一种方法
打开 Xaml 文件并删除菜单块中的“/”。在其下方添加我添加的四行,并关闭菜单标签,如 </menu>
// ...
<Menu IsMainMenu="True" Height="27" HorizontalAlignment="Left" Name="menu1" VerticalAlignment="Top" Width="503" >
<MenuItem Header="_File " />
<MenuItem Header="_Edit " />
<MenuItem Header="_View " />
<MenuItem Header="_Help " />
</Menu> ...
请看图片以更好地理解
这里有一个关于 Menu 类公开的 "IsMainMenu"
属性的有趣事实,它使菜单在用户按下 Alt 或 F10 键时按预期运行。此属性默认设置为“true”,适用于添加到窗体的每个菜单。
当用户按下 Alt 或 F10 时。菜单是 XAML 中首先出现的那个。然后用户可以通过所有菜单项进行 Tab 切换。如果你想在菜单下创建子菜单,例如文件,则添加以下 xaml 代码
//
<Window x:Class="supertest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid> <MenuItem Header="_File" Visibility="Visible" Name="mnuFile" >
<MenuItem Header="_New..." Click="New_Click" >
</MenuItem>
</MenuItem>
<MenuItem Header="_Edit" />
<MenuItem Header="_View" />
<MenuItem Header="_Help" />
</Grid>
</Window>
现在按 F5,你会看到“文件”菜单中添加了“新建...”子菜单。同样,你可以添加其他菜单。
另一种方法
这种方法非常简单,因为在这里你不需要在 xaml 中编码,只需遵循简单的过程即可。在 "mainWindow"
中点击并选择菜单栏。转到属性并在 "Common"
属性下选择 "Items"
。点击编辑器按钮,将弹出一个新窗口。在这里你将看到所有当前菜单项。如果你想添加另一个,只需点击“添加”,然后在属性框的“Header”部分中输入一个名称。例如,你只需点击“添加”并输入名称 "Project"
。关闭窗口并按 F5。你将看到“Project”是另一个菜单项。至此,我们已经完成了添加菜单和子菜单,以创建一个完美的桌面应用程序。现在我们想在子菜单旁边添加工具栏按钮。如下图所示
在我们的应用程序中,“新建...” “打开...” 和 “保存” 菜单应在左侧显示图形(即图标)。这部分相当棘手。熟悉 Windows 窗体的人知道,Windows 窗体中有一个名为 Resources 的文件夹,要访问其中的文件,你只需在代码后端提供路径即可。但在 WPF 中,一开始并没有这样的 Resources 文件夹。这里的过程是...
(我假设你已经下载了桌面上的新建、打开和保存选项的 png / ico 文件)
在解决方案资源管理器中,双击“属性”。在新选项卡窗口中转到“资源”。点击“添加资源”的下拉列表。点击“添加现有文件”。转到桌面并添加你下载的三个文件。关闭选项卡,你将看到解决方案资源管理器中已添加资源文件夹。
这部分还没有结束。即使你已将这些文件置于 Resources 文件夹下,你仍需要告诉框架这些文件将用作资源。转到 解决方案资源管理器
,转到 Resources
并选择任何图像,转到 属性
,转到 高级
并在 生成操作
属性下将“无”更改为“资源”。对其他文件也进行同样操作。
现在你可以将这些文件用作工具栏图标,请按照下面的 xaml 代码操作,特别是**粗体**-*斜体*部分
</MenuItem> <MenuItem Header="_New..." Name="menuNew"> <MenuItem.Icon> <Image Source ="Resources/1340618235_flag-new-blue.png"/> </MenuItem.Icon> </MenuItem> <MenuItem Header="_Open..." Name="menuOpen"> <MenuItem.Icon> <Image Source ="Resources/1340611542_Open.ico"/> </MenuItem.Icon> </MenuItem> <MenuItem Header="_Save" Command ="Save" Name="menuSave" > <MenuItem.Icon> <Image Source="Resources/1340613938_save.ico" /> </MenuItem.Icon> </MenuItem>
当我在 mainWindow.xaml 中编写这段代码时,它与下面的代码类似
</MenuItem>
<MenuItem Header="_New..." Name="menuNew" Command="New">
<MenuItem.Icon>
<Image Source ="Resources/1340618235_flag-new-blue.png"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="_Open..." Name="menuOpen" Command="Open">
<MenuItem.Icon>
<Image Source ="Resources/1340611542_Open.ico"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="_Save" Command ="Save" Name="menuSave" >
<MenuItem.Icon>
<Image Source="Resources/1340613938_save.ico" />
</MenuItem.Icon>
</MenuItem>
唯一不同的是,这个 Command="New"
会将所有子菜单置于非活动/禁用状态。所以即使你尝试添加像 Click="New_Click"
这样的点击事件,它也无法工作。我稍后会告诉你为什么会这样?也许在我的下一篇文章中。
到目前为止,我们已经创建了带图标的菜单和子菜单。现在是最后一部分。我的主要目的是指导你创建像普通桌面应用程序一样的菜单。所以这部分已经完成。
现在我将编写一个简单的代码,用于在主窗口中加载图像,并尝试使用鼠标滚轮进行放大和缩小。
首先从工具箱中在网格中放置一个图像框。默认情况下,它的名称将是 image1。
现在在 xaml 文件中选择“打开”子菜单并转到“属性”。选择“事件”。双击“点击”事件或在“点击”框旁边写入 "Open_Click"
。在这里你可以看到“打开”菜单的名称为 menuOpen
,不要使用任何其他名称,否则会收到编译时错误。
在你的 mainWindow.xaml.cs 文件中的 Open_Click
事件中输入以下代码。
private void Open_Click(object sender, RoutedEventArgs e) { FileDialog fDlg = new OpenFileDialog(); fDlg.DefaultExt = ".jpg"; fDlg.FilterIndex = 1; if (fDlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { BitmapImage bmp = new BitmapImage(); bmp.BeginInit(); bmp.UriSource = new Uri(fDlg.FileName); bmp.EndInit(); image1.Source = bmp; } } }
如果编译时没有遇到任何错误,那么你很幸运,或者你的 Visual Studio 版本可能已经添加了所需的引用。我们中的许多人实际上会在以下行中遇到错误。
FileDialog fDlg = new OpenFileDialog();
你可能会收到错误“FileDialoge 的类型命名空间不存在于命名空间中...”
这是因为默认情况下,WPF 引用中不包含 System.Windows.Forms 命名空间。因此,要添加该命名空间,请右键单击“引用”,然后单击“添加引用...
”。它将再次打开另一个窗口,选择“.Net”选项卡,导航到“System.Windows.Forms
”并选择它或双击它。现在在你的 mainWindow.xaml.cs
文件中
添加图像的最后一行,"using System.Windows.Forms"
,就不会有编译时错误。
我们已经在 WPF 中完成了菜单和子菜单的创建。现在是运行应用程序的时候了。按下 F5。选择“文件”,选择“新建”并在图像框中加载一个图像文件。
关注点
在我编写代码时,我使用了大量的互联网资源,但它们太多了,而且组织方式不佳,所以我不能在这里列出所有名称。wpftutorial.net 的一些文章确实帮助了我。
在 WPF 中为菜单项编码时,我学到了很多东西。它很有趣,也很有挑战性,有时也令人沮丧。这就是我作为一个新人开始分享我所学到的知识的原因。
摘要
希望这个解释能帮助初学者,特别是那些寻求在桌面应用程序中创建菜单项的人。当然,对于这种编程/设计,肯定有更好的方法,更好的代码,我试图深入探讨的纯粹是从初学者的角度出发。