c# - WPF在 View 模型中获取鼠标坐标

标签 c# wpf mvvm

我有一个WPF项目(C#,MVVM Light,Visual Studio 2010)。

关于关注点分离(MVVM),我有一个问题,基本上是这样的:我在 View 模型中有一条命令。我有一个上下文菜单,我想调用该命令。到目前为止,一切都很好。问题在于该命令需要协调鼠标的单击。

更具体一点,只有在单击特定的Canvas控件时才会显示ContextMenu,而这正是我想要的上述Canvas控件中的坐标。

做到这一点的简单方法是在XAML文档后面的代码中进行全部管理(并且我已经能够做到这一点),但是如果可以的话,我宁愿将其包含在ViewModel中。原因是此命令中存在对我的数据模型的调用,因此最终导致分离问题。

我知道PassEventArgsToCommand,但我知道这是一个不好的做法,但是在这种情况下,我不确定是否可以解决。所以目前我确实尝试过,看起来像这样:

<ContextMenu x:Key="BackgroundMenu">
            <MenuItem Header="Add new node here">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <cmd:EventToCommand Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.DataContext.AddNewNodeAtLocationCommand}" PassEventArgsToCommand="True"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </MenuItem> 
        </ContextMenu>

因此,现在我的命令在 View 模型中如下所示:
void AddNewNodeAtLocationExecute(RoutedEventArgs e)
    {

        return;
    }

在这种方法中,我想获取那些鼠标坐标,但是我不知道是否可能。 e.OriginalSource是'MenuItem',并没有太大帮助。

那我该怎么做呢?我可以这样做吗?还是应该仅由后面的代码处理这一命令?所说的代码将涉及对数据库的调用,这就是为什么我对分离如此特别的原因。

提前致谢。

最佳答案

好吧,我偶然发现了this question,它谈到关注点分离和不关注点分离。

最后,我将我的两个想法合并了。首先,ContextMenu只是链接到后面的代码。到那时,我得到了想要的坐标。然后,后面的代码获取 View 的DataContext(我想要的命令所在的位置)并调用Execute方法(首先检查了'can'方法)。

我想这与您将要实现的理想。

关于c# - WPF在 View 模型中获取鼠标坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46717765/

相关文章:

c# - 在 .NET 中使用 PerformanceCounter 测量 CPU 使用率的正确方法

c# - InkCanvas 上的 MouseLeftButtonDown 事件

java - 如何使用翻新和MVVM使用用户输入查询API?

c# - 通过服务器 : Wrong path to excel file? 上的代码运行宏

c# - 在数组中使用 Person 类

c# - 指定三次贝塞尔曲线中的张力

c# - 了解 WPF - 在模型或 ViewModel 中存储数据

c# - 在 UWP、MVVM 中实现周期性进程

c# - 获取要在自定义属性中使用的属性值

c# - 在 WPF DataGrid 中绑定(bind) DataGridColumn 的 Visible 属性