将RoutedUICommand命名空间连接到WPF(VB.NET)

时间:2019-03-02 21:15:18

标签: c# wpf vb.net xaml

我试图创建一个自定义的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#的文档。

1 个答案:

答案 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>

我们得到以下结果:

WPF VB.NET CommandBindings

另一个选择是安迪在评论中引用的内容:

  1. 为您的窗口创建一个ViewModel。
  2. 在ViewModel中定义命令
  3. 将Window的事件绑定到命令中。

有关更多信息:https://social.technet.microsoft.com/wiki/contents/articles/28738.using-icommand-with-mvvm-pattern.aspx