如何为wpf中的菜单项添加点击事件?
How to add click event for menu item in wpf?
在 MainWindow.xaml
中的按钮上下文菜单中
<Button.ContextMenu>
<ContextMenu x:Name="options"
Opened="OptionsMenu_Opened">
<MenuItem Header="Add path"
Click="AddPath"
InputGestureText="Ctrl+P"/>
<MenuItem Header="Save logs"
Click="SaveLogs"
InputGestureText="Ctrl+S"/>
<MenuItem Header="Clear logs"
Click="ClearLogs"
InputGestureText="Ctrl+D"/>
<Separator/>
<MenuItem x:Name="allow_edit"
Header="Allow editing"
Click="Allow_edit_Click"/>
<MenuItem x:Name="topmost_switcher"
Header="Window top-most"
Click="Switch_Window_Topmost"/>
<Separator/>
<MenuItem x:Name="filter_setter"
Header="Filter"
Click="Filter_setter_Click"/>
<MenuItem x:Name="include_subdir"
Header="Include subdirectories"
Click="Include_subdir_Click"/>
<Separator/>
<MenuItem Header="View source code"
Click="View_source_code_Click"/>
</ContextMenu>
</Button.ContextMenu>
</Button>
我添加了“添加路径”部分:
<MenuItem Header="Add path"
Click="AddPath"
InputGestureText="Ctrl+P"/>
但是当我尝试编译项目时出现错误,因为 MainWindow 不包含 AddPath :
'MainWindow' 不包含 'AddPath' 的定义,并且找不到可访问的扩展方法 'AddPath' 接受类型 'MainWindow' 的第一个参数(您是否缺少使用指令或程序集引用?)
查看 MainWindow.xaml.cs 时,我看到其他菜单项的事件,例如 SaveLogs :
private void SaveLogs(object sender, RoutedEventArgs e)
{
try
{
SaveFileDialog sfd = new SaveFileDialog()
{
Filter = "TXT|*.txt",
FileName = $"watcher_{DateTime.Now:yyyyMMddHHmmss}"
};
if (sfd.ShowDialog() == true)
{
string path = sfd.FileName;
string content = new TextRange(
richTextBox_main.Document.ContentStart,
richTextBox_main.Document.ContentEnd).Text;
File.WriteAllText(path, content);
PrintMsg($"saved log to \"{path}\"");
}
}
catch (Exception ex)
{
PrintErr(ex);
}
}
如何为 AddPath 创建相同的事件类型?如何修复此错误?
在 WPF 世界中,您确实应该考虑 MVVM 方法而不是代码隐藏。在 MVVM 方法中,您将使用命令绑定,而不是单击事件。
例如:
<MenuItem Header="Add path" Command="{Binding AddPathCommand}" />
当然,如果您通常没有视图的视图模型,则可能需要进行一些实质性更改。但大部分内容已经在一些 mvvm 框架中编写,如 MvvmLight、Prism 等
我强烈建议您通过使用命令绑定的 MVVM 方法。
https://www.c-sharpcorner.com/UploadFile/6f0898/learn-simple-mvvm-and-command-bindings-in-15-mins/
在 MainWindow.xaml
中的按钮上下文菜单中<Button.ContextMenu>
<ContextMenu x:Name="options"
Opened="OptionsMenu_Opened">
<MenuItem Header="Add path"
Click="AddPath"
InputGestureText="Ctrl+P"/>
<MenuItem Header="Save logs"
Click="SaveLogs"
InputGestureText="Ctrl+S"/>
<MenuItem Header="Clear logs"
Click="ClearLogs"
InputGestureText="Ctrl+D"/>
<Separator/>
<MenuItem x:Name="allow_edit"
Header="Allow editing"
Click="Allow_edit_Click"/>
<MenuItem x:Name="topmost_switcher"
Header="Window top-most"
Click="Switch_Window_Topmost"/>
<Separator/>
<MenuItem x:Name="filter_setter"
Header="Filter"
Click="Filter_setter_Click"/>
<MenuItem x:Name="include_subdir"
Header="Include subdirectories"
Click="Include_subdir_Click"/>
<Separator/>
<MenuItem Header="View source code"
Click="View_source_code_Click"/>
</ContextMenu>
</Button.ContextMenu>
</Button>
我添加了“添加路径”部分:
<MenuItem Header="Add path"
Click="AddPath"
InputGestureText="Ctrl+P"/>
但是当我尝试编译项目时出现错误,因为 MainWindow 不包含 AddPath :
'MainWindow' 不包含 'AddPath' 的定义,并且找不到可访问的扩展方法 'AddPath' 接受类型 'MainWindow' 的第一个参数(您是否缺少使用指令或程序集引用?)
查看 MainWindow.xaml.cs 时,我看到其他菜单项的事件,例如 SaveLogs :
private void SaveLogs(object sender, RoutedEventArgs e)
{
try
{
SaveFileDialog sfd = new SaveFileDialog()
{
Filter = "TXT|*.txt",
FileName = $"watcher_{DateTime.Now:yyyyMMddHHmmss}"
};
if (sfd.ShowDialog() == true)
{
string path = sfd.FileName;
string content = new TextRange(
richTextBox_main.Document.ContentStart,
richTextBox_main.Document.ContentEnd).Text;
File.WriteAllText(path, content);
PrintMsg($"saved log to \"{path}\"");
}
}
catch (Exception ex)
{
PrintErr(ex);
}
}
如何为 AddPath 创建相同的事件类型?如何修复此错误?
在 WPF 世界中,您确实应该考虑 MVVM 方法而不是代码隐藏。在 MVVM 方法中,您将使用命令绑定,而不是单击事件。
例如:
<MenuItem Header="Add path" Command="{Binding AddPathCommand}" />
当然,如果您通常没有视图的视图模型,则可能需要进行一些实质性更改。但大部分内容已经在一些 mvvm 框架中编写,如 MvvmLight、Prism 等
我强烈建议您通过使用命令绑定的 MVVM 方法。 https://www.c-sharpcorner.com/UploadFile/6f0898/learn-simple-mvvm-and-command-bindings-in-15-mins/