首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF Mvvm将鼠标按钮事件移动到命令

WPF Mvvm将鼠标按钮事件移动到命令
EN

Stack Overflow用户
提问于 2022-09-28 10:33:20
回答 1查看 150关注 0票数 2

我开始使用MVVM,但是我发现很难复制我对事件所做的简单事情:我有一个画布,我想得到鼠标单击的位置,所以我执行了一个命令,xaml是这样的

代码语言:javascript
运行
复制
<Canvas x:Name="cnvLeft">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="PreviewMouseDown">
                <cmd:EventToCommand Command="{Binding CanvasClick}" 
                                    PassEventArgsToCommand="True"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
        
    </Canvas>

然而,它只传递鼠标参数,这是不够的,因为我需要发送者,我如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-29 13:56:53

建议:为鼠标单击事件注册一个公共事件处理程序。

MVVM与代码隐藏无关。使用代码隐藏是绝对好的,甚至是必要的。

代码隐藏文件是一个编译器特性,即语言特性(部分类)。它们与应用程序体系结构无关。MVVM不关心编译器--没有设计模式这样做。

MVVM也不关心命令(或数据绑定或任何框架概念)。命令是框架基础结构的一部分,MVVM不关心框架--没有设计模式。

MVVM并不意味着使用命令。事件通常也一样好。所以不要强迫命令。不要使用交互行为将输入事件转换为命令,只需直接处理事件(当然是在视图中)。

控件必须始终在MVVM应用程序的视图中处理。控件的代码隐藏文件是一个部分类。它是控件的一部分,因此也是视图的一部分。

在宿主控件的代码隐藏中实现用户输入事件处理程序。在这里,您必须实现Canvas相关逻辑(UI逻辑)。

如果要封装逻辑,可以将其与Canvas一起移动到新的自定义Control (或UserControl)。

MainWindow.xaml

代码语言:javascript
运行
复制
<Window>
  <Canvas PreviewMouseDown="OnCanvasePreviewMouseDown" />
</Window>

MainWindow.xaml.cs

代码语言:javascript
运行
复制
private void OnCanvasePreviewMouseDown(object sender, MouseButtonEventArgs e)
{
  var canvas = sender as Canvas;
  Point canvasClickPosition = e.GetPosition(canvas);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73879992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档