我试图创建一个自定义的CommandBinding,所以我决定将其放入自己的类中,以便在将来添加更多内容。
XAML
<Window x:Name="frmWPFtest" x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:self="clr-namespace:WPFtesting.CustomCommands"
xmlns:local="clr-namespace:WPFtesting"
mc:Ignorable="d"
Title="WPF Testing" Height="800" Width="800" MinWidth="800" MinHeight="800">
<Window.CommandBindings>
<CommandBinding Command="self:cmdExit" CanExecute="CommonCommandBinding_CanExecute" />
</Window.CommandBindings>
命令类
Namespace CustomCommands
Public Class cCustCmds
Public cmdExit As New RoutedUICommand("Exit",
"Exit",
GetType(MainWindow),
New InputGestureCollection(New KeyGesture(Key.F4, ModifierKeys.Shift)))
End Class
End Namespace
使用self:cmdExit
时出现CommandConvertor cannot convert System.String
错误,而使用self:cCustCmds.cmdExit
时出现Name "cCustCmds" does not exist in "WPFtesting.CustomCommands"
错误。
是否有一种特定的方法可以使VB中的类包含Commands?我实际上没有找到任何有关VB,所有C#的文档。
答案 0 :(得分:1)
基于this article,在XAML中定义的CommandBindings必须指向在MainWindow中定义的方法:
原因是,当前WPF版本的XAML不允许我们以这种方式绑定事件处理程序。必须在MainWindow类内的代码隐藏文件中定义事件处理程序。我不知道这是一个错误,一个意外遗漏的功能,还是我们甚至不应该使用此功能,但这使我们无法定义一个集中的位置来处理所有命令的Execute和CanExecute事件。>
一种选择是定义CommandBindings in code:
Class MainWindow
Private Sub MainWindow_OnLoaded(sender As Object, e As RoutedEventArgs)
Dim openCmdBinding As New CommandBinding(
ApplicationCommands.Open, Sub(o, args) MyCommands.MyCommandExecute())
Me.CommandBindings.Add(openCmdBinding)
End Sub
End Class
Public Class MyCommands
Public Shared Sub MyCommandExecute()
MessageBox.Show("test")
End Sub
End Class
使用以下XAML:
<Grid>
<Menu DockPanel.Dock="Top">
<MenuItem Header="File">
<MenuItem Command="ApplicationCommands.Open"/>
</MenuItem>
</Menu>
</Grid>
我们得到以下结果:
另一个选择是安迪在评论中引用的内容: