如何获取自定义控件的某个部分上的鼠标位置

13 浏览
0 Comments

如何获取自定义控件的某个部分上的鼠标位置

我在制作一个自定义控件时,尝试获取位于自定义控件内部的画布上的鼠标位置。问题是,当我将自定义控件放在测试应用程序中时,该应用程序只是一个窗口中的网格,我得到的始终是窗口本身上的鼠标位置,而不是自定义控件上的鼠标位置。

以下是在Generic.xaml中包含的xaml代码:

这是我用于计算角度的两个函数:

任何提示?

谢谢

0
0 Comments

问题的出现原因是_PART_SecondCanvas和_PART_FirstCanvas为空,因为它们属于子Slider的控件模板,而不是"main" HueWheel模板。因此,无法使用HueWheel的GetTemplateChild()来获取它们。

解决方法是在OnApplyTemplate()方法中先找到Slider,然后应用它的模板,最后在该模板上调用FindName()来找到canvas元素。

代码如下:

public override void OnApplyTemplate()

{

base.OnApplyTemplate();

//_PART_FirstCanvas = (Canvas)GetTemplateChild("PART_FirstCanvas");

//_PART_SecondCanvas = (Canvas)GetTemplateChild("PART_SecondCanvas");

_PART_Slider = (Slider)GetTemplateChild("PART_Slider");

_PART_Slider.ApplyTemplate();

var sliderTemplate = _PART_Slider.Template;

_PART_FirstCanvas = (Canvas)sliderTemplate.FindName("PART_FirstCanvas", _PART_Slider);

_PART_SecondCanvas = (Canvas)sliderTemplate.FindName("PART_SecondCanvas", _PART_Slider);

}

一旦找到_PART_SecondCanvas和_PART_FirstCanvas,你的OnMouseMove()函数就会按照预期的方式工作。

0
0 Comments

问题的出现原因:

问题的出现是因为在自定义控件的代码中,想要获取鼠标的位置,但是使用了错误的方法和变量,导致无法获得正确的结果。

解决方法:

根据其他人的建议,可以直接调用e.GetPosition(Application.Current.MainWindow);来获取相对于主窗口的鼠标位置。不需要再关心_PART_SecondCanvas变量。

代码整理如下:

Point ControlPos = e.GetPosition (this);
Point WindowPos = e.GetPosition( Application.Current.MainWindow );

以上代码将给出控件和窗口坐标中的坐标。

但是我希望在自定义控件的代码中获取鼠标位置,以便重复使用。

在你的建议中,“me”是什么?

您还可以直接调用e.GetPosition(Application.Current.MainWindow);来获取相对位置。

Point relativeLocation = _PART_SecondCanvas.TranslatePoint(newPos, Application.Current.MainWindow); 这给了我一个错误,"对象引用未设置为对象的实例"。很奇怪,因为_PART_SecondCanvas已经在上面声明了...

所以显然,_PART_SecondCanvas始终为空...这是因为OnApplyTemplate()是如何调用的还是其他原因?找不到如何修复它,但你的解决方法可能是我认为的解决方法。

直接相对于主窗口获取位置,就像我之前的评论中所说的那样。不要再关心_PART_SecondCanvas了。

抱歉,我是初学者。尝试了你写的:Point newPos = e.GetPosition(Application.Current.MainWindow);给我完全相同的结果。屏幕上的位置...

Point newPos = e.GetPosition(_PART_SecondCanvas); Point relativeLocation = this.TranslatePoint(newPos, Application.Current.MainWindow); 它给了我同样的结果,这部分自定义控件是在一个容器中(在Generic.xaml中),可能是这个问题吗?

如果_PART_SecondCanvas为空,你需要解决这个问题。_PART_FirstCanvas 也是空的吗?

0