【问题标题】:Cannot properly form xaml for command binding无法正确形成用于命令绑定的 xaml
【发布时间】:2017-02-07 15:45:54
【问题描述】:

我正在尝试实现命令绑定,以便我的用户可以使用 Alt+ 进行导航。我找到了this 示例,但在形成 xmlns 和 CommandBinding xaml 时遇到问题。

这是我目前所拥有的。我知道它的格式不正确。

    xmlns:local="clr-namespace:xxxxx"

<Window.CommandBindings>
    <CommandBinding
        Command="{x:Static local:xxxxx.ProjectMsg}"
        Executed="ProjectMsg"/>
</Window.CommandBindings>

该命令的编码在 MainWindow vb 中:

Class MainWindow


Public Shared ProjectTab_AltP As New RoutedCommand


Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.

End Sub

Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded


    ProjectTab_AltP.InputGestures.Add(New KeyGesture(Key.P, ModifierKeys.Control))
    Me.CommandBindings.Add(New CommandBinding(ProjectTab_AltP, AddressOf Me.ProjectMsg))

End Sub

Private Sub ProjectMsg(sender As Object, e As ExecutedRoutedEventArgs)

    MessageBox.Show("hi")

End Sub

我收到一个错误,名称空间 clr-namespace:xxxxx 中不存在名称“xxxxx”。

在主窗口 vb 中,没有声明命名空间。如果我尝试添加一个,则会出现许多错误。

我必须在主窗口 vb 中有一个命名空间吗?

我是 wpf 的菜鸟,因此我将不胜感激任何帮助或建议。谢谢。

【问题讨论】:

    标签: wpf vb.net


    【解决方案1】:

    我必须在主窗口 vb 中有一个命名空间吗?

    没有。在 Visual Studio 中的 Project->Properties->Application->Root 命名空间下检查应用程序的根命名空间。默认与您的应用程序名称相同,例如“WpfApplication1”:

    xmlns:local="clr-namespace:WpfApplication1"
    

    您还应该通过 属性 公开命令:

    Public Shared ReadOnly Property ProjectTab_AltP() As RoutedUICommand = New RoutedUICommand()
    

    <Window.CommandBindings>
        <CommandBinding
        Command="{x:Static local:MainWindow.ProjectTab_AltP}"
        Executed="ProjectMsg"/>
    </Window.CommandBindings>
    

    【讨论】:

      【解决方案2】:

      local 是 VB 命名空间 xxxxx 的别名。 xxxxx 是否包含在 xxxxx 中?不,它不包含在它自身之中。 local:xxxxx 最多可以表示类似xxxxx.xxxxx 的意思,只是你不能将命名空间放在那里。

      绑定到静态命令属性的正确方法是这样的:

      Command="{x:Static local:WhateverClassName.StaticCommandProperty}"
      

      什么是静态命令属性?

      这是一个返回命令的静态属性。命令是实现接口System.Windows.Input.ICommand 的任何对象。 ProjectMsg 不是这样的。这是一种方法。

      请参阅 mm8 的出色答案,了解如何通过该方法解决您的问题。

      下面是一种更纯粹的 XAML 方法。

      我认为您在 MainWindow_Loaded 中创建的命令绑定是可以的,但请尝试将这些内容注释掉并在您的 XAML 中执行此操作。 唯一 在您的 VB 中使用的是您的 ProjectMsg() 执行处理程序方法。

      <Window.Resources>
          <!-- Create a command object. -->
          <RoutedUICommand
              x:Key="ProjectMsgCmdResource"
              />
      </Window.Resources>
      <Window.CommandBindings>
          <!-- Bind the command object to your command execute method. -->
          <CommandBinding
              Command="{StaticResource ProjectMsgCmdResource}"
              Executed="ProjectMsg"
              />
      </Window.CommandBindings>
      <Window.InputBindings>
          <!-- And bind a key input binding to your command. -->
          <KeyBinding
              Key="P"
              Modifiers="Ctrl"
              Command="{StaticResource ProjectMsgCmdResource}"
              />
      </Window.InputBindings>
      

      【讨论】:

      • 根命名空间根据项目属性为“xxxxx”。我似乎无法在 vb 编码中的正确位置获得 ProjectTab_AltP 属性而不会出错。它到底去哪儿了?我把它放在“Class MainWindow”下并单独放在一个类中,但出现该属性不可访问的错误,“xxxxx”中不存在“xxxxx”。或者扩展属性无法初始化。谢谢
      • @EManning 我在回答中解释了这一点。如果您无法理解,只需复制 mm8 的内容即可。他向你展示了该做什么。只需从他的回答中复制并粘贴此 XAML:Command="{x:Static local:MainWindow.ProjectTab_AltP}"。
      • 我发现我在一个命令绑定语句的末尾有一个“()”。删除它们后 alt+P 工作正常。我保持“公共共享 ProjectTab_AltP ...”不变。如果它真的应该更改为属性,那么我上面的问题仍然适用。感谢你们俩的帮助。
      猜你喜欢
      • 2017-06-05
      • 2023-04-09
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      相关资源
      最近更新 更多