WPF:写入矩形取决于使用多重绑定的鼠标位置

Posted

技术标签:

【中文标题】WPF:写入矩形取决于使用多重绑定的鼠标位置【英文标题】:WPF: Write rectangle depends on the mouse position using multibinding 【发布时间】:2021-06-08 21:01:36 【问题描述】:

如何编写一个绘制矩形的 WPF 应用程序。矩形的大小应取决于鼠标位置。鼠标指针始终位于矩形的一个角上。 矩形始终居中。

它应该看起来像这样:

这是我的代码:

XAML:

<Window x:Class="MyNamespace.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyNamespace"
        mc:Ignorable="d"
        Title="MainWindow" x:Name="window1" Height="450" Width="800" MouseMove="Grid1_MouseMove">

    <Window.Resources>
        <local:SizeConverter x:Key="sizeConv" />
    </Window.Resources>

    <Rectangle Fill="Blue" 
       Width="Binding ElementName=window1, Path=MousePos.X" 
       Height="Binding ElementName=window1, Path=MousePos.Y" 
     HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Window>

C#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace MyNamespace

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    
        private Point _mousePos;

        public MainWindow()
        
            InitializeComponent();
        

        public event PropertyChangedEventHandler PropertyChanged;


        public Point MousePos
        
            get  return _mousePos; 
            set
            
                _mousePos = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("MousePos"));
            
        


        private void Grid1_MouseMove(object sender, MouseEventArgs e)
        
            MousePos = e.GetPosition(window1);
        
    

提前致谢!

【问题讨论】:

注意“矩形的大小和位置应该取决于鼠标位置”和“矩形是始终居中”是矛盾的要求。 @clemens 谢谢,没看到 【参考方案1】:

如果我理解你的问题,你想在窗口的中心画一个矩形。该矩形的大小是根据鼠标指针位置计算的。 使鼠标指针始终位于矩形的一角。

矩形的高度是

rect.Height = Math.Abs(mousePosition.Y - container.ActualHeight / 2) * 2

矩形的宽度为

rect.Width = Math.Abs(mousePosition.X - container.ActualWidth / 2) * 2

您需要创建一个包含属性的 ViewModel

public class MyRectContainerViewModel : BaseViewModel

    private double _actualHeight;
    public double ActualHeight
    
        get  return  _actualHeight; 
        set 
        
            if (_actualHeight != value)
            
                _actualHeight = value;
                RecalculateSize();
            
        
    

    private double _actualWidth;

    public double ActualWidth
    
        get  return _actualWidth; 
        set
        
            if (_actualWidth != value)
            
                _actualWidth = value;
                RecalculateSize();
            
        
    


    private Point _mousePosition;

    public Point MousePosition
    
        get  return _mousePosition; 
        set 
        
            if (!value.Equals(_mousePosition))
            
                _mousePosition = value;
                RecalculateSize();
            
        
    

    public double RectHeight  get; private set; 
    public double RectWidth  get; private set; 


    private void RecalculateSize()
    
        RectWidth = Math.Abs(MousePosition.X - ActualWidth / 2) * 2;
        RectHeight = Math.Abs(MousePosition.Y - ActualHeight / 2) * 2;
        OnPropertyChanged(nameof(RectHeight));
        OnPropertyChanged(nameof(RectWidth));
    

矩形的DataContext是MyRectContainerViewModel。

如果您使用的是 MVVM,则需要找到一种方法来更新 ActualHeight 和 ActualWidth。 ActualHeight

虽然它有一个 ActualHeightProperty 支持字段,但 ActualHeight 不会引发属性更改通知,它应该被视为常规 CLR 属性而不是依赖属性。

鼠标位置的同上。您可以使用交互性 使用示例Binding Mouse position

【讨论】:

以上是关于WPF:写入矩形取决于使用多重绑定的鼠标位置的主要内容,如果未能解决你的问题,请参考以下文章

2021-10-02 WPF上位机 54-MVVM模式中的鼠标行为与命令绑定

在鼠标位置绘制矩形和形状渲染矩形

WPF备忘录WPF获取和设置鼠标位置与progressbar的使用方法

HTML5 Canvas 中旋转矩形内的鼠标位置

WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里?

WPF程序里,有一个ListView,想要在其中拖动鼠标,生成一个矩形框,并选中矩形框中的item元素,该怎么做