在命令绑定中获取点击位置

6

我想要做的是一个包含网格部分的UserControl,在点击网格时会发生某些事情。我需要知道点击发生的像素位置,并且我正在以MVVM方式完成所有这些操作。 我知道如何在我的ViewModel上提示操作:

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

我的问题是我不知道如何获取坐标,您有什么建议吗?非常感谢您的帮助!

3个回答

14

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;
}

谢谢您先生。这是一个非常出色的答案。 - sagneta

6
这个怎么样?
private void MinimapClick(object parameter)
{
    Point mousePos = Mouse.GetPosition(myWindow);
}

如果您没有窗口的引用,您可以将其作为参数发送(或使用任何您想要的参考点)。

好主意!这让我走上了正确的道路...我会在我的答案中更详细地阐述我的解决方案。感谢您的帮助! - beta vulgaris

1

我有一个相关的问题 - 我想捕获鼠标位置,以便为我的上下文菜单的点击事件进行处理。问题是:我的菜单的父级(一个图像控件)无法被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>

1
编辑:我以为那样会起作用,但不幸的是,X和Y坐标是相对于上一次点击事件的,这恰好是在我的上下文菜单上发生的,而不是在我右键单击启动上下文菜单的图像上。 - ActualRandy
我知道有点晚了,但是...你可以在右键点击图像时调用一个命令,将鼠标坐标发送并保存到一个变量中,然后在 AddEntryCmd 被触发时使用那些保存的坐标。 - Mike Marynowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接