在WPF中处理MVVM中的鼠标事件

编程入门 行业动态 更新时间:2024-10-11 15:25:06
本文介绍了在WPF中处理MVVM中的鼠标事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在将MVVM与WPF一起使用.我在某种程度上停下来了,我希望您对此有意见.我正在使用MouseBehaviour.cs类触发鼠标事件,是否还有其他方法可以在MVVM WPF中处理鼠标事件

I am Using MVVM with WPF. i am halted in a way, i want your views about this. i am firing Mouse Events using MouseBehaviour.cs class , Is there any other way to handle Mouse Events in MVVM WPF

using System.Windows; using System.Windows.Input; namespace Lovatts.MouseBehaviours { public class MouseBehaviour { #region MouseUp public static readonly DependencyProperty MouseUpCommandProperty = DependencyProperty.RegisterAttached("MouseUpCommand", typeof(ICommand), typeof(MouseBehaviour), new FrameworkPropertyMetadata(new PropertyChangedCallback(MouseUpCommandChanged))); private static void MouseUpCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { FrameworkElement element = (FrameworkElement)d; element.MouseUp += element_MouseUp; } static void element_MouseUp(object sender, MouseButtonEventArgs e) { FrameworkElement element = (FrameworkElement)sender; ICommand command = GetMouseUpCommand(element); command.Execute(e); } public static void SetMouseUpCommand(UIElement element, ICommand value) { element.SetValue(MouseUpCommandProperty, value); } public static ICommand GetMouseUpCommand(UIElement element) { return (ICommand)element.GetValue(MouseUpCommandProperty); } #endregion #region MouseDown public static readonly DependencyProperty MouseDownCommandProperty = DependencyProperty.RegisterAttached("MouseDownCommand", typeof(ICommand), typeof(MouseBehaviour), new FrameworkPropertyMetadata(new PropertyChangedCallback(MouseDownCommandChanged))); private static void MouseDownCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { FrameworkElement element = (FrameworkElement)d; element.MouseDown += element_MouseDown; } static void element_MouseDown(object sender, MouseButtonEventArgs e) { FrameworkElement element = (FrameworkElement)sender; ICommand command = GetMouseDownCommand(element); command.Execute(e); } public static void SetMouseDownCommand(UIElement element, ICommand value) { element.SetValue(MouseDownCommandProperty, value); } public static ICommand GetMouseDownCommand(UIElement element) { return (ICommand)element.GetValue(MouseDownCommandProperty); } #endregion #region MouseLeave public static readonly DependencyProperty MouseLeaveCommandProperty = DependencyProperty.RegisterAttached("MouseLeaveCommand", typeof(ICommand), typeof(MouseBehaviour), new FrameworkPropertyMetadata(new PropertyChangedCallback(MouseLeaveCommandChanged))); private static void MouseLeaveCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { FrameworkElement element = (FrameworkElement)d; element.MouseLeave += new MouseEventHandler(element_MouseLeave); } static void element_MouseLeave(object sender, MouseEventArgs e) { FrameworkElement element = (FrameworkElement)sender; ICommand command = GetMouseLeaveCommand(element); command.Execute(e); } public static void SetMouseLeaveCommand(UIElement element, ICommand value) { element.SetValue(MouseLeaveCommandProperty, value); } public static ICommand GetMouseLeaveCommand(UIElement element) { return (ICommand)element.GetValue(MouseLeaveCommandProperty); } #endregion #region MouseLeftButtonDown public static readonly DependencyProperty MouseLeftButtonDownCommandProperty = DependencyProperty.RegisterAttached("MouseLeftButtonDownCommand", typeof(ICommand), typeof(MouseBehaviour), new FrameworkPropertyMetadata(new PropertyChangedCallback(MouseLeftButtonDownCommandChanged))); private static void MouseLeftButtonDownCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { FrameworkElement element = (FrameworkElement)d; element.MouseLeftButtonDown += element_MouseLeftButtonDown; } static void element_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { FrameworkElement element = (FrameworkElement)sender; ICommand command = GetMouseLeftButtonDownCommand(element); command.Execute(e); } public static void SetMouseLeftButtonDownCommand(UIElement element, ICommand value) { element.SetValue(MouseLeftButtonDownCommandProperty, value); } public static ICommand GetMouseLeftButtonDownCommand(UIElement element) { return (ICommand)element.GetValue(MouseLeftButtonDownCommandProperty); } #endregion #region MouseLeftButtonUp public static readonly DependencyProperty MouseLeftButtonUpCommandProperty = DependencyProperty.RegisterAttached("MouseLeftButtonUpCommand", typeof(ICommand), typeof(MouseBehaviour), new FrameworkPropertyMetadata(new PropertyChangedCallback(MouseLeftButtonUpCommandChanged))); private static void MouseLeftButtonUpCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { FrameworkElement element = (FrameworkElement)d; element.MouseLeftButtonUp += element_MouseLeftButtonUp; } static void element_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { FrameworkElement element = (FrameworkElement)sender; ICommand command = GetMouseLeftButtonUpCommand(element); command.Execute(e); } public static void SetMouseLeftButtonUpCommand(UIElement element, ICommand value) { element.SetValue(MouseLeftButtonUpCommandProperty, value); } public static ICommand GetMouseLeftButtonUpCommand(UIElement element) { return (ICommand)element.GetValue(MouseLeftButtonUpCommandProperty); } #endregion #region MouseMove public static readonly DependencyProperty MouseMoveCommandProperty = DependencyProperty.RegisterAttached("MouseMoveCommand", typeof(ICommand), typeof(MouseBehaviour), new FrameworkPropertyMetadata(new PropertyChangedCallback(MouseMoveCommandChanged))); private static void MouseMoveCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { FrameworkElement element = (FrameworkElement)d; element.MouseMove += new MouseEventHandler(element_MouseMove); } static void element_MouseMove(object sender, MouseEventArgs e) { FrameworkElement element = (FrameworkElement)sender; ICommand command = GetMouseMoveCommand(element); command.Execute(e); } public static void SetMouseMoveCommand(UIElement element, ICommand value) { element.SetValue(MouseMoveCommandProperty, value); } public static ICommand GetMouseMoveCommand(UIElement element) { return (ICommand)element.GetValue(MouseMoveCommandProperty); } #endregion #region MouseRightButtonDown public static readonly DependencyProperty MouseRightButtonDownCommandProperty = DependencyProperty.RegisterAttached("MouseRightButtonDownCommand", typeof(ICommand), typeof(MouseBehaviour), new FrameworkPropertyMetadata(new PropertyChangedCallback(MouseRightButtonDownCommandChanged))); private static void MouseRightButtonDownCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { FrameworkElement element = (FrameworkElement)d; element.MouseRightButtonDown += element_MouseRightButtonDown; } static void element_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { FrameworkElement element = (FrameworkElement)sender; ICommand command = GetMouseRightButtonDownCommand(element); command.Execute(e); } public static void SetMouseRightButtonDownCommand(UIElement element, ICommand value) { element.SetValue(MouseRightButtonDownCommandProperty, value); } public static ICommand GetMouseRightButtonDownCommand(UIElement element) { return (ICommand)element.GetValue(MouseRightButtonDownCommandProperty); } #endregion #region MouseRightButtonUp public static readonly DependencyProperty MouseRightButtonUpCommandProperty = DependencyProperty.RegisterAttached("MouseRightButtonUpCommand", typeof(ICommand), typeof(MouseBehaviour), new FrameworkPropertyMetadata(new PropertyChangedCallback(MouseRightButtonUpCommandChanged))); private static void MouseRightButtonUpCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { FrameworkElement element = (FrameworkElement)d; element.MouseRightButtonUp += element_MouseRightButtonUp; } static void element_MouseRightButtonUp(object sender, MouseButtonEventArgs e) { FrameworkElement element = (FrameworkElement)sender; ICommand command = GetMouseRightButtonUpCommand(element); command.Execute(e); } public static void SetMouseRightButtonUpCommand(UIElement element, ICommand value) { element.SetValue(MouseRightButtonUpCommandProperty, value); } public static ICommand GetMouseRightButtonUpCommand(UIElement element) { return (ICommand)element.GetValue(MouseRightButtonUpCommandProperty); } #endregion #region MouseWheel public static readonly DependencyProperty MouseWheelCommandProperty = DependencyProperty.RegisterAttached("MouseWheelCommand", typeof(ICommand), typeof(MouseBehaviour), new FrameworkPropertyMetadata(new PropertyChangedCallback(MouseWheelCommandChanged))); private static void MouseWheelCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { FrameworkElement element = (FrameworkElement)d; element.MouseWheel += new MouseWheelEventHandler(element_MouseWheel); } static void element_MouseWheel(object sender, MouseWheelEventArgs e) { FrameworkElement element = (FrameworkElement)sender; ICommand command = GetMouseWheelCommand(element); command.Execute(e); } public static void SetMouseWheelCommand(UIElement element, ICommand value) { element.SetValue(MouseWheelCommandProperty, value); } public static ICommand GetMouseWheelCommand(UIElement element) { return (ICommand)element.GetValue(MouseWheelCommandProperty); } #endregion } }

这是我的Xaml代码

<Window x:Class="Lovatts.MouseBehaviours.MainWindow" xmlns="schemas.microsoft/winfx/2006/xaml/presentation" xmlns:x="schemas.microsoft/winfx/2006/xaml" xmlns:MouseBehaviours="clr-namespace:Lovatts.MouseBehaviours" x:Name="RibbonWindow" Width="640" Height="480" DataContext="{Binding Main, Source={StaticResource Locator}}"> <Grid> <Rectangle Width="100" Height="100" Fill="Blue" MouseBehaviours:MouseBehaviour.MouseUpCommand="{Binding MouseUpCommand}"> </Rectangle> <Rectangle Width="100" Height="100" x:Name="Rectangle" Fill="Red" MouseBehaviours:MouseBehaviour.MouseUpCommand="{Binding MouseUpCommand}" Margin="75,109,457,241"> </Rectangle> </Grid> </Window>

MainViewModel.cs

using System.Windows.Input; using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Command; using System; using System.Diagnostics; using System.Collections.Generic; using System.Windows; namespace MouseBehaviours.ViewModel { public class MainViewModel : ViewModelBase { private RelayCommand _mouseUpCommand; public RelayCommand MouseUpCommand { get { if (_mouseUpCommand == null) return _mouseUpCommand = new RelayCommand(param => ExecuteMouseUp((MouseEventArgs)param)); return _mouseUpCommand; } set { _mouseUpCommand = value; } } private void ExecuteMouseUp(MouseEventArgs e) { Console.WriteLine("Mouse Up : " + e.GetPosition((IInputElement)e.Source)); } } public class RelayCommand : ICommand { #region Fields private readonly Action<object> _execute; private readonly Predicate<object> _canExecute; private string _displayText; public static List<string> Log = new List<string>(); private Action<object> action; #endregion // Fields #region Constructors /// <summary> /// Creates a new command that can always execute. /// </summary> /// <param name="execute">The execution logic.</param> public RelayCommand(Action<object> execute) : this(execute, null) { } /// <summary> /// Creates a new command. /// </summary> /// <param name="execute">The execution logic.</param> /// <param name="canExecute">The execution status logic.</param> public RelayCommand(Action<object> execute, Predicate<object> canExecute) : this(execute, canExecute, "") { } public RelayCommand(Action<object> execute, Predicate<object> canExecute, string displayText) { if (execute == null) throw new ArgumentNullException("execute"); _execute = execute; _canExecute = canExecute; _displayText = displayText; } public string DisplayText { get { return _displayText; } set { _displayText = value; } } #endregion // Constructors #region ICommand Members [DebuggerStepThrough] public bool CanExecute(object parameter) { return _canExecute == null ? true : _canExecute(parameter); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public void Execute(object parameter) { _execute(parameter); } #endregion // ICommand Members } //class MainViewModel //{ //} }

推荐答案

@harjeet,您需要对Image MouseUp使用以下结构,即在TextBlock中尝试使用超链接命令属性"代替"Image":

@harjeet you need to use the below structure for Image MouseUp i.e instead of using "Image" try to use "Hyperlink command property" in TextBlock:

<TextBlock Panel.ZIndex="990" Canvas.Right="30" Canvas.Left="498" Canvas.Top="4"> <Hyperlink TextDecorations="None" Command="{Binding CloseLoginSettingPopup}"> <Image Cursor="Hand" x:Name="Pop2" Source="/img/close1.png" Height="40" Width="40" Panel.ZIndex="990" Canvas.Right="30" Canvas.Left="498" Canvas.Top="4" /> </Hyperlink> </TextBlock>

更多推荐

在WPF中处理MVVM中的鼠标事件

本文发布于:2023-11-12 13:19:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1581621.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:鼠标   事件   WPF   MVVM

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!