MVVM、WPF、C# 中的拇指拖动

Posted

技术标签:

【中文标题】MVVM、WPF、C# 中的拇指拖动【英文标题】:Thumb Drag in MVVM, WPF, C# 【发布时间】:2015-10-12 08:41:03 【问题描述】:

我有一个用 C# WPF 编写的工作应用程序。我喜欢练习使用 MVVM,所以我喜欢编写与 MVVM 相同的应用程序。但是我遇到了一个问题。在我的应用程序中,我使用了

<Thumb DragDelta="Thumb_Drag" 
       DragStarted="Thumb_DragStarted"
       DragCompleted="Thumb_DragCompleted"
       ...

我如何在 MVVM 中编写这个“Drag&Drop/Draggable”示例?我使用“绑定”或其他什么?任何示例都将受到欢迎:) 谢谢!

如果不明白请问我。

【问题讨论】:

【参考方案1】:

可以使用System.Windows.Interactivitylibrary,它可以作为参考添加到您的项目中。

添加命名空间:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

并通过&lt;i:InvokeCommandAction&gt;调用命令:

<Thumb>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="DragDelta">
            <i:InvokeCommandAction Command="Binding DataContext.ThumbDragDeltaCommand, RelativeSource=RelativeSource AncestorType=x:Type Window" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Thumb>

视图模型:

private ICommand ThumbDragDeltaCommand  get; set;

public MainViewModel() //Constructor

    ThumbDragDeltaCommand = new DelegateCommand(x => 
    
        //EventHandler
        //Do stuff...
    

但是,您仍然可以在代码隐藏中处理事件,同时仍然提交到 MVVM 模式,只要事件仅触发图形更改。

【讨论】:

这与我发布的答案有何不同? 互联网上任何地方的任何例子?只是为了填满它:)用一些例子总是更容易:) @esispaned 我会说谷歌“WPF Commands MVVM”和“WPF DelegateCommand”。网上有很多资源,谷歌是你的朋友 :) 另外,如果这是你正在寻找的答案,请考虑将其标记为已接受的答案。旁注,DelegateCommand 类还不是 BCL 的一部分,但您可以在此处找到实现:link【参考方案2】:

根据您在这些事件处理程序中的逻辑类型,我认为将它们放在代码隐藏中不会有问题。毕竟 MVVM 只是一般指导方针,而不是严格的规则。 如果您坚持在视图模型中实现它们,您可以添加对System.Windows.Interactivity dll 的引用并使用InvokeCommandActionInteraction.Trigger

<Thumb>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Thumb_Drag" >
            <i:InvokeCommandAction Command="Binding SomeViewModelCommand" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Thumb>

【讨论】:

以上是关于MVVM、WPF、C# 中的拇指拖动的主要内容,如果未能解决你的问题,请参考以下文章

WPF 滑块仅可拖动

WPF 拖放 C# 也可以拖动图像

WPF C#如何使用鼠标使控件可拖动

C# wpf 实现任意控件拖动

C# WPF 可拖动用户控件在 Canvas 上的 ListBox 中

WPF TreeView内部拖动项