2017-02-07 4 views
0

コマンドバインディングを実装しようとしていますので、ユーザーはAlt +をナビゲーションに使用できます。 thisの例が見つかりましたが、xmlnsとCommandBinding xamlの作成に問題があります。コマンドバインディングのためにxamlを正しく作成できません

これはこれまで私が行ってきたことです。私はそれが正しく形成されていないことを知っている。

xmlns:local="clr-namespace:xxxxx" 

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

コマンドのためのコーディングは、メイン・ウィンドウVBでここにある:XXXXXを:

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 

私は名前を「xxxxxは」名前空間のCLR名前空間に存在しないというエラーが出ます。

メインウィンドウvbには、宣言された名前空間がありません。追加しようとすると数多くのエラーが発生します。

メインウィンドウに名前空間が必要ですか?

私はwpfでnoobですので、何か助けやアドバイスをいただければ幸いです。ありがとう。

答えて

1

メインウィンドウに名前空間が必要ですか?

いいえアプリケーションのルート名前空間がVisual Studioの[プロジェクト] - [プロパティ] - [アプリケーション] - [ルート名前空間]の下にあることを確認してください。これは、例えば、デフォルトでは、アプリケーションの名前、 "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> 
0

localはVBネームスペースxxxxxの別名です。 xxxxxxxxxxが含まれていますか?いいえ、それはそれ自体に含まれていません。 local:xxxxxは最大でxxxxx.xxxxxのようなものですが、そこに名前空間を置くことはできません。

staticコマンドプロパティにバインドするための正しい方法は、このようなものです:

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

staticコマンドプロパティは何?

これはコマンドを返す静的なプロパティです。コマンドは、インタフェース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> 
+0

プロジェクトのプロパティに応じて、ルート名前空間は「xxxxx」です。私はエラーを取得せずにVBのコーディングの正しい場所にProjectTab_AltPプロパティを取得するように見えることはできません。どこに行くの?私はそれを "Class MainWindow"の下に置いていますが、クラス自体では、プロパティにアクセスできないというエラーが出ます。 "xxxxx"は "xxxxx"には存在しません。拡張されたプロパティを初期化することはできません。ありがとう – EManning

+0

@ EManning私は私の答えでそれを説明した。理解できない場合は、mm8の内容をコピーしてください。彼はあなたに何をすべきか正確に示しました。 'X =静的ローカル:MainWindow.ProjectTab_AltP} ''の答えから、このXAMLをコピーして貼り付けてください。 –

+0

私は、コマンドバインディングステートメントの1つの末尾に "()"があることを発見しました。 alt + Pは削除した後に正常に機能しました。私は "Public Shared ProjectTab_AltP ..."を同じままにしました。それが本当にプロパティに変更する必要がある場合、上記の私の質問はまだ適用されます。両方のおかげであなたの助けになりました。 – EManning

関連する問題