我想要做的是一个UserControl包含一个带网格的部分,点击网格时会发生一些事情。我需要点击发生的像素的位置,我正在做所有这些MVVM风格。 我知道如何在ViewModel上提示操作:
<Grid>
<Grid.InputBindings>
<MouseBinding Gesture="LeftClick" Command="{Binding MinimapClick}"/>
</Grid.InputBindings>
</Grid>
我现在的问题是我不知道如何检索坐标...任何想法? 感谢您的帮助!
答案 0 :(得分:12)
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;
}
答案 1 :(得分:5)
这个怎么样?
private void MinimapClick(object parameter)
{
Point mousePos = Mouse.GetPosition(myWindow);
}
如果您没有对窗口的引用,您可以将其作为参数发送(或使用您想要的任何参考点)。
答案 2 :(得分: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));
在哪里&#34; mnuGrid&#34;是我的上下文菜单的名称。
在我这样做之后,我能够将我的控制作为参数传递给我的命令,正如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>