6

我想要做的是一个用户控件,其中包含一个带有网格的部分,单击网格时会发生一些事情。我需要点击发生的像素的位置,并且我正在做所有这种 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 回答