首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用DrawingContext.DrawRectangle块鼠标绘制的矩形

用DrawingContext.DrawRectangle块鼠标绘制的矩形
EN

Stack Overflow用户
提问于 2012-11-11 05:24:59
回答 3查看 4.4K关注 0票数 3

下面的WPF程序打开一个窗口,如下所示:

鼠标在黑色方块外移动会导致窗口标题根据鼠标的位置进行更新。当鼠标进入正方形时,更新停止。

我希望即使鼠标在方块上,MouseMove也能继续触发。有没有办法做到这一点?

代码语言:javascript
运行
复制
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace Wpf_Particle_Demo
{
    class DrawingVisualElement : FrameworkElement
    {
        public DrawingVisual visual;

        public DrawingVisualElement() { visual = new DrawingVisual(); }

        protected override int VisualChildrenCount { get { return 1; } }

        protected override Visual GetVisualChild(int index) { return visual; }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var canvas = new Canvas();

            Content = canvas;

            var element = new DrawingVisualElement();

            canvas.Children.Add(element);

            CompositionTarget.Rendering += (s, e) =>
                {
                    using (var dc = element.visual.RenderOpen())
                        dc.DrawRectangle(Brushes.Black, null, new Rect(0, 0, 50, 50));
                };

            MouseMove += (s, e) => Title = e.GetPosition(canvas).ToString();
        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-11 06:13:02

您将需要Capture鼠标这将允许您的Canvas继续响应MouseMove事件,尝试像这样它将更新您的坐标只要鼠标被按下

代码语言:javascript
运行
复制
public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();


        var canvas = new Canvas();
        Content = canvas;

        var element = new DrawingVisualElement();

        canvas.Children.Add(element);
        CompositionTarget.Rendering += (s, e) =>
        {
            using (var dc = element.visual.RenderOpen())
                dc.DrawRectangle(Brushes.Black, null, new Rect(0, 0, 50, 50));
        };

        Mouse.Capture(canvas);
        MouseDown += (s, e) => Mouse.Capture((UIElement)s);
        MouseMove += (s, e) => Title = e.GetPosition(canvas).ToString();
        MouseUp += (s, e) => Mouse.Capture(null);

    }

第二种方法

代码语言:javascript
运行
复制
public MainWindow()
{
    InitializeComponent();
    var canvas = new Canvas();
    Content = canvas;

    DrawingVisualElement element = new DrawingVisualElement();
    Grid myElement = new Grid();
    canvas.Children.Add(myElement);

    CompositionTarget.Rendering += (s, e) =>
    {
        using (var dc = element.visual.RenderOpen())
        {
            dc.DrawRectangle(Brushes.Black, null, new Rect(100, 0, 50, 50));
        }

        DrawingImage myImage = new DrawingImage(element.visual.Drawing);
        myElement.Height = myImage.Height;
        myElement.Width = myImage.Width;
        myElement.Background = new ImageBrush(myImage);
    };


    MouseMove += (s, e) => Title = e.GetPosition(canvas).ToString();
}

使用钩子的请确保将using System.Windows.Interop;

代码语言:javascript
运行
复制
public partial class MainWindow : Window
{


    public MainWindow()
    {
        InitializeComponent();
        var canvas = new Canvas();
        Content = canvas;

        var element = new DrawingVisualElement();
        canvas.Children.Add(element);

        CompositionTarget.Rendering += (s, e) =>
        {
            using (var dc = element.visual.RenderOpen())
            {
                dc.DrawRectangle(Brushes.Black, null, new Rect(0, 0, 50, 50));
            }
        };
        this.SourceInitialized += new EventHandler(OnSourceInitialized);
    }

    void OnSourceInitialized(object sender, EventArgs e)
    {
        HwndSource source = (HwndSource)PresentationSource.FromVisual(this);
        source.AddHook(new HwndSourceHook(HandleMessages));

    }
    IntPtr HandleMessages(IntPtr hwnd, int msg,IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if (msg == 0x200)
            Title = Mouse.GetPosition(this).ToString(); // because I did not want to split the lParam into High/Low values for Position information
        return IntPtr.Zero;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2012-11-11 06:55:33

到目前为止,最简单的方法是在窗口PreviewMouseDown上使用“隧道”事件。它首先被传递到窗口,然后在层次结构中向上移动。因此,窗口中有哪些其他元素根本无关紧要。在代码中:

代码语言:javascript
运行
复制
public partial class Window1 : Window {
    public Window1() {
        InitializeComponent();
        this.PreviewMouseMove += new MouseEventHandler(Window1_PreviewMouseMove);
    }
    void Window1_PreviewMouseMove(object sender, MouseEventArgs e) {
        this.Title = e.GetPosition(this).ToString();
    }
}
票数 3
EN

Stack Overflow用户

发布于 2014-01-24 01:39:08

答案就简单多了。你需要做的就是设置element.IsHitTestVisible=false;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13326226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档