【问题标题】:Detecting When A Control Moves On Canvas in WPF检测控件何时在 WPF 中的画布上移动
【发布时间】:2012-10-05 20:00:00
【问题描述】:

我有一个自定义 UserControl,它的位置绑定到 ViewModel 中的参数。

<Canvas Name="CursorCanvas">
    <ctrl:HandCursor x:Name="RightHandCursor" State="{Binding RightHandState}" Visibility="{Binding IsHandTracking, Converter={StaticResource BoolToVisibilityConverter}}" Canvas.Top="{Binding RightHandY}" Canvas.Left="{Binding RightHandX}" />
</Canvas>

在这个控件内部,我正在执行 HitTest,以确定它下面的内容。当前,此 HitTest 连接到 DispatcherTimer ta 1 秒间隔。我宁愿告诉控件在 Canvas 上移动时执行 HitTest,但我无法找到如何在正在移动的 UserControl 中捕获 Canvas 位置更新。

如何在上面定义的“HandCursor”用户控件的代码隐藏中捕获 Canvas.Top/Left 移动更新?

非常感谢!

【问题讨论】:

  • 真的需要从光标本身跟踪光标的位置吗?你不能使用画布上的 MouseMove 事件来跟踪画布上的位置吗?
  • 我没有使用鼠标。这是一个自定义控件,其 x/y 通过不同的输入设备(具体来说是 Kinect)进行更新。

标签: c# wpf wpf-controls hittest


【解决方案1】:

您可以通过覆盖Canvas.LeftCanvas.Top 附加属性的属性元数据来添加PropertyChangedCallback

static HandCursor()
{
    Canvas.LeftProperty.OverrideMetadata(
        typeof(HandCursor),
        new FrameworkPropertyMetadata(
            (o, e) => ((HandCursor)o).LeftPropertyChanged((double)e.NewValue)));

    Canvas.TopProperty.OverrideMetadata(
        typeof(HandCursor),
        new FrameworkPropertyMetadata(
            (o, e) => ((HandCursor)o).TopPropertyChanged((double)e.NewValue)));
}

private void LeftPropertyChanged(double left)
{
    ...
}

private void TopPropertyChanged(double top)
{
    ...
}

【讨论】:

  • 谢谢你,克莱门斯。我的自定义光标现在是免费的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
相关资源
最近更新 更多