如何获取自定义控件的某个部分上的鼠标位置
问题的出现原因是_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()函数就会按照预期的方式工作。
问题的出现原因:
问题的出现是因为在自定义控件的代码中,想要获取鼠标的位置,但是使用了错误的方法和变量,导致无法获得正确的结果。
解决方法:
根据其他人的建议,可以直接调用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
也是空的吗?