0

我有一个自定义 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 移动更新?

非常感谢!

4

1 回答 1

3

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

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)
{
    ...
}
于 2012-10-05T20:19:48.957 回答