簡體   English   中英

WPF Mvvm 將鼠標按鈕事件移動到命令

[英]WPF Mvvm move mouse button event to Command

我開始使用 MVVM,但我發現很難復制我對事件所做的簡單事情:我有一個 canvas,我想獲得鼠標單擊的 position,所以我執行了一個命令,xaml 就是這個

<Canvas x:Name="cnvLeft">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="PreviewMouseDown">
                <cmd:EventToCommand Command="{Binding CanvasClick}" 
                                    PassEventArgsToCommand="True"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
        
    </Canvas>

但是它只傳遞鼠標 arguments,這還不夠,因為我需要發件人,我該如何解決這個問題?

正如已經推薦的那樣:為鼠標單擊事件注冊一個公共事件處理程序。

MVVM 不關心代碼隱藏。 使用代碼隱藏是絕對好的,甚至是必要的。
代碼隱藏文件是一種編譯器功能,即語言功能(部分類)。 它們與應用程序架構無關。 MVVM 不關心編譯器——沒有設計模式關心。

MVVM 也不關心命令(或數據綁定或任何框架概念)。 命令是框架基礎設施的一部分,MVVM 不關心框架——沒有設計模式關心。
MVVM 並不意味着使用命令。 事件通常一樣好。 所以不要強行命令。 與其使用交互行為將輸入事件轉換為命令,不如直接處理事件(當然是在視圖中)。

控件必須始終在 MVVM 應用程序的視圖中處理。 控件的代碼隱藏文件是部分 class。它是控件的一部分,因此也是視圖的一部分。

在宿主控件的代碼隱藏中實現用戶輸入事件處理程序。 這里必須實現Canvas相關邏輯(UI邏輯)。
如果要封裝邏輯,可以將其與Canvas一起移動到新的UserControl Control

主窗口.xaml

<Window>
  <Canvas PreviewMouseDown="OnCanvasePreviewMouseDown" />
</Window>

MainWindow.xaml.cs

private void OnCanvasePreviewMouseDown(object sender, MouseButtonEventArgs e)
{
  var canvas = sender as Canvas;
  Point canvasClickPosition = e.GetPosition(canvas);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM