前言
作者:浪子花梦,一个有趣的程序员 ~
在上一文中,我们给帮助菜单设置了点击事件,事件处理器在隐藏代码中,生成程序时,他们会编译在一起,这就造成了紧耦合性非常大,今天我们将使用MVVM模式来解除耦合性,使用命令系统来替换点击事件
. . .
前文如下所示:
【WPF高仿 Windows记事本】开发日记 (一) UI布局与 帮助菜单 功能实现
1)自定义命令类:
使用别人写好的轮子,直接调用即可,我们创建一个文件夹 Helpers,其中有三个类,这三个类就是我在网上下载的别人写好的类,使用这些类,我们就可以直接定义命令了,使用非常方便,如下所示:
代码在下面的链接之中已经说明,需要的可以直接 Copy一下:
WPF使用成熟的命令系统
3)创建存放Win32API的类,如下所示:
我们在上文中用到了一个api 是ShellAbout,我们在此类中定义如下所示:
方法和类都是静态的,需要的话我们直接调用即可 . . .
.
.
2)构建MVVM设计模式,创建 ViewModels 文件夹,存放主窗口与帮助菜单的业务逻辑:
2.1)设计HelpViewModel 帮助菜单业务逻辑类,代码如下所示,其中包括了命令定义,命令的创建:
class HelpViewModel
{
// 创建三个命令,对应帮助菜单中的三个子菜单
public RelayCommand HelpCommand { get; }
public RelayCommand FeedBackCommand { get; }
public RelayCommand AboutCommand { get; }
public HelpViewModel()
{
HelpCommand = new RelayCommand(OnHelpCommand);
FeedBackCommand = new RelayCommand(OnFeedBackCommand);
AboutCommand = new RelayCommand(OnAboutCommand);
}
private void OnHelpCommand()
{
// 打开帮助网页
Process.Start("https://go.microsoft.com/fwlink/?LinkId=834783");
}
private void OnFeedBackCommand()
{
// 打开反馈中心
Process.Start("feedback-hub://?appid=5201314");
}
private void OnAboutCommand()
{
// 利用反射获取当前程序集的控制权
Assembly assembly = Assembly.GetExecutingAssembly();
// 获取当前程序集的标题名称
var title = assembly.GetCustomAttribute(typeof(AssemblyTitleAttribute)) as AssemblyTitleAttribute;
// 获取当前程序集的版本号
var version = assembly.GetCustomAttribute(typeof(AssemblyFileVersionAttribute)) as AssemblyFileVersionAttribute;
// 获取资源中的图标以流的方式保存
StreamResourceInfo streamResourceInfo = Application.GetResourceStream(new Uri("Notepad_WPF.ico", UriKind.Relative));
Icon icon = new Icon(streamResourceInfo.Stream); // 获取流中的图标
// 显示关于框(Win32API)
Win32Helper.ShellAbout(Process.GetCurrentProcess().MainWindowHandle, title.Title, version.Version, icon.Handle);
}
}
当命令触发时,这些方法将被调用,与上一文中有点类似 . . .
2.2)设计主窗口业务逻辑 MainViewModels类,其中定义了帮助菜单的业务逻辑类:
// 主窗口的业务逻辑类
class MainViewModels
{
// 帮助菜单的业务逻辑(命令等)
public HelpViewModel HelpViewModel { get; }
public MainViewModels()
{
HelpViewModel = new HelpViewModel();
}
}
.
.
3)在XAML 代码中引用主窗口业务逻辑类,在数据上下文中引用:
.
.
4)给帮助菜单绑定命令:
其中数据上下文(HelpViewModel)表示的是主窗口业务逻辑类(MainViewModels)的一个属性 . . .
.
.
5)完整的文件目录如下所示: