使用MVVM时如何将MouseEvent和UIControl作为两个参数传递?

How to pass MouseEvent and UIControl as two parameters when using MVVM?

提问人:howze 提问时间:11/17/2023 更新时间:11/17/2023 访问量:53

问:

我正在将图片查看器项目更改为 MVVM,XAML 代码如下。

<ScrollViewer Name="scrollViewer" HorizontalScrollBarVisibility="Visible">

   <Grid Name="Mygrid" Width="400" Height="490" HorizontalAlignment="Stretch" >
       <Grid.LayoutTransform>
           <TransformGroup x:Name="TfGroup">
                <ScaleTransform x:Name="MyscaleTransform"/>
            </TransformGroup>
        </Grid.LayoutTransform>

   <Border x:Name="imgborder" HorizontalAlignment="Center" VerticalAlignment="Center">
     <Image x:Name="Myimg" />
   </Border>
 
   <Canvas x:Name="canvas" Background="Transparent"/>

  </Grid>
</ScrollViewer>

原始代码如下(不使用 MVVM):

private void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    lastMousePositionOnTarget = Mouse.GetPosition(Mygrid);

    System.Windows.Point centerPoint = e.GetPosition(Myimg);

    var val = e.Delta * 0.01;

    if (MyscaleTransform.ScaleX + val < 0.1) return;
    if (MyscaleTransform.ScaleX + val > 100) return;

    MyscaleTransform.CenterX = centerPoint.X;
    MyscaleTransform.CenterY = centerPoint.Y;

    MyscaleTransform.ScaleX += val;
    MyscaleTransform.ScaleY += val;

}

我尝试使用 MVVM 并在 XAML 中添加以下代码:

<i:Interaction.Triggers>
  <i:EventTrigger EventName="PreviewMouseWheel">
     <i:InvokeCommandAction Command="{Binding TestCommand}" PassEventArgsToCommand="True"/>
  </i:EventTrigger>
</i:Interaction.Triggers>

现在问题来了,在过去的代码中,我访问了 'Mygrid'、'Myimg' 等 UIControls,现在,在 ViewModel 中,如果接收到鼠标事件,我无法同时接收 UIControls 作为参数,

[RelayCommand]
private void Test(MouseWheelEventArgs e)
{
    //How to receive UIControls 'Mygrid' ,'Myimg' as parameters?
    lastMousePositionOnTarget = Mouse.GetPosition(Mygrid);

    System.Windows.Point centerPoint = e.GetPosition(Myimg);
}

我搜索了相关帖子,但没有找到相关答案。他们中的大多数人都讨论了如何传递多个参数。我没有看到同时传递鼠标事件和参数,或者他们使用了较旧的 MVVMLight,现在已经过时了。

那么,如果我使用 CommunityToolkit.Mvvm,我该如何实现上述功能呢?

谢谢

wpf 命令 community-toolkit-mvvm

评论

3赞 Clemens 11/17/2023
您既不会将 UI 事件传递给视图模型,也不会将 UI 元素传递给视图模型。视图模型不了解视图元素(如事件和控件)。MVVM 并不意味着在您的视图中没有代码。保留 OnPreviewMouseWheel 处理程序,并将 ScaleTransform 属性添加到在处理程序方法中更新的视图模型。无论如何,IMO 为简单图像查看器的缩放和平移转换实现 MVVM 没有多大意义。请考虑编写一个 UserControl 来封装此功能(在其代码隐藏中)。

答: 暂无答案