6

私がやりたいのは、グリッドをクリックすると何かが起こる、グリッドのあるセクションを含む UserControl です。クリックが発生したピクセルの位置が必要で、この MVVM スタイルをすべて実行しています。ViewModel でアクションを促す方法を知っています。

<Grid>
 <Grid.InputBindings>
   <MouseBinding Gesture="LeftClick" Command="{Binding MinimapClick}"/>
 </Grid.InputBindings>
</Grid>

私の問題は、座標を取得する方法がわからないことです...何かアイデアはありますか? 私はあなたの助けに感謝します!

4

3 に答える 3

13

KDiTraglia には適切なポインタがありました... いずれにせよ、アクションの定義と ViewModel へのバインドに問題がありました。他の誰かが問題を抱えている場合に備えて、私の解決策を投稿します。xamlで行ったことは次のとおりです。

<Grid Width="100" Height="100" Grid.Column="2" Grid.Row="2" x:Name="TargetGrid">
    <Grid>
        <Grid.InputBindings>
            <MouseBinding Gesture="LeftClick" Command="{Binding Path=TargetClick}" CommandParameter="{Binding ElementName=TargetGrid}" />
        </Grid.InputBindings>
    </Grid>
</Grid>

UserControl を作成し、ViewModel にバインドします。ViewModel で、次のコマンドを実装して作成します。

public class PositioningCommand : ICommand
{
    public PositioningCommand()
    {
    }

    public void Execute(object parameter)
    {
        Point mousePos = Mouse.GetPosition((IInputElement)parameter);
        Console.WriteLine("Position: " + mousePos.ToString());
    }

    public bool CanExecute(object parameter) { return true; }

    public event EventHandler CanExecuteChanged;
}

public PositioningCommand TargetClick
{
    get;
    internal set;
}
于 2012-10-01T06:30:33.777 に答える
5

これはどう?

private void MinimapClick(object parameter)
{
    Point mousePos = Mouse.GetPosition(myWindow);
}

ウィンドウへの参照がない場合は、パラメーターとして送信できます (または、必要な参照ポイントを使用します)。

于 2012-09-28T15:17:18.210 に答える
0

関連する問題がありました - ContextMenuのクリック イベントのマウス位置をキャプチャしたかったのです。問題: メニューの(イメージ コントロール) が CommandParameter ElementName によって認識されませんでした。

参考までに、メニューを名前空間に追加するに受け取ったバインディング エラーは次のとおりです。

    System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=imgArena'. BindingExpression:(no path); DataItem=null; target element is 'MenuItem' (Name='mnuAddItem'); target property is 'CommandParameter' (type 'Object')

どうやら、WPF コンテキスト メニューはコントロールとは異なるビジュアル ツリーに属しているため、バインドが非常にイライラします。

いくつかの調査の後、コードビハインドのコンストラクターに配置したこの簡単な修正を見つけました。

    NameScope.SetNameScope(mnuGrid, NameScope.GetNameScope(this));

「mnuGrid」はコンテキスト メニューの名前です。

これを行った後、Beta Vulgaris が上記で行ったのとまったく同じように、コントロールをパラメーターとしてコマンドに渡すことができました。

参考までに、私の XAML は次のようになります。

    <Image Name="imgArena" >
        <Image.ContextMenu>
            <ContextMenu Name="mnuGrid">
                <MenuItem Header="Place _Entry" Name="mnuAddItem"
                    Command="{Binding AddEntryCmd}" 
                    CommandParameter="{Binding ElementName=imgArena}" />
            </ContextMenu>
        <Image.ContextMenu>
    </Image>
于 2016-05-19T19:42:01.290 に答える