Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将RouteDiCommand命名空间连接到WPF(VB.NET)_C#_Wpf_Vb.net_Xaml - Fatal编程技术网

C# 将RouteDiCommand命名空间连接到WPF(VB.NET)

C# 将RouteDiCommand命名空间连接到WPF(VB.NET),c#,wpf,vb.net,xaml,C#,Wpf,Vb.net,Xaml,我正在尝试创建一个自定义CommandBinding,我决定将其放入自己的类中,以便以后添加更多 XAML 使用self:cmdExit时,我获取一个CommandConverter无法转换System.String错误,使用self:cCustCmds.cmdExit时,我获取的名称cCustCmds在WPFtesting.CustomCommandserror中不存在 有没有一种特殊的方法来创建一个包含VB命令的类?我没有发现任何与VB相关的文档,所有基于C的,XAML中定义的命令绑定必须指

我正在尝试创建一个自定义CommandBinding,我决定将其放入自己的类中,以便以后添加更多

XAML

使用self:cmdExit时,我获取一个CommandConverter无法转换System.String错误,使用self:cCustCmds.cmdExit时,我获取的名称cCustCmds在WPFtesting.CustomCommandserror中不存在

有没有一种特殊的方法来创建一个包含VB命令的类?我没有发现任何与VB相关的文档,所有基于C的,XAML中定义的命令绑定必须指向在主窗口中定义的方法:

原因是,当前WPF版本的XAML不允许我们以这种方式绑定事件处理程序。事件处理程序必须在MainWindow类内的代码隐藏文件中定义。我不知道这是否是一个bug,一个意外遗漏的特性,或者我们甚至不应该使用这个功能,但这阻止了我们定义一个集中的位置来处理所有命令的执行和CanExecute事件

一个选项是定义:

使用以下XAML:

<Grid>
    <Menu DockPanel.Dock="Top">
        <MenuItem Header="File">
            <MenuItem Command="ApplicationCommands.Open"/>
        </MenuItem>
    </Menu>
</Grid>
我们得到以下结果:

另一个选项是Andy在评论中提到的内容:

为窗口创建ViewModel。 在ViewModel中定义命令 将窗口的事件绑定到命令中。
更多信息:

现在很少有团队使用vb。这就是为什么你能找到的所有样品都是c夏普。不要使用你在那里的方法。改为绑定到viewmodel中的icommand公共属性。虽然这确实可以按我所希望的方式工作,但这不只是覆盖常规的ApplicationCommand.Open命令吗?我想我必须指向ICommand才能真正创建自定义命令?
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
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
<Grid>
    <Menu DockPanel.Dock="Top">
        <MenuItem Header="File">
            <MenuItem Command="ApplicationCommands.Open"/>
        </MenuItem>
    </Menu>
</Grid>