C# 依赖性属性更改不';不要触发一个安排

C# 依赖性属性更改不';不要触发一个安排,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我有一个自定义面板,用于定义此依赖项属性: public static readonly DependencyProperty DragPositionProperty = DependencyProperty.Register( "DragPosition", typeof(Point), typeof(LogViewHeaderPanel), new FrameworkPropertyMetadata( new Point(),

我有一个自定义面板,用于定义此依赖项属性:

public static readonly DependencyProperty DragPositionProperty =
    DependencyProperty.Register(
    "DragPosition",
    typeof(Point),
    typeof(LogViewHeaderPanel),
    new FrameworkPropertyMetadata(
        new Point(),
        FrameworkPropertyMetadataOptions.AffectsParentArrange
    )
);
注意:我也尝试过FrameworkPropertyMetadataOptions.AffectsRange

LogViewHeaderPanel是名为LogViewHeader的自定义项控件的面板。其项的类型为ColumnHeader。每当移动鼠标,并且LogViewHeader中满足一些其他条件时,目标ColumnHeader就会使用以下代码设置属性:

_currentlyActiveColumnHeader.SetValue(
    LogViewHeaderPanel.DragPositionProperty,
    new Point(suggestedXPosition, originalPosition.Y)
);
如果我在LogViewHeaderPanel.ArrangeOverride的覆盖上放置了一个断点,我可以看到在创建/调整LogViewHeader的大小时调用该断点,但在其子项上设置DragPosition属性时不会调用该断点


为什么FrameworkPropertyMetadataOptions.AffectsParentArrange参数在设置属性时未触发排列?

您正在设置
\u CurrentlyActivityColumnHeader
上的
拖动位置
属性,该属性不是
LogViewHeaderPanel
。对于这种使用,您必须将
拖动位置注册为

只需将
dependencProperty.Register
替换为
dependencProperty.RegisterAttached

public static readonly DependencyProperty DragPositionProperty =
    DependencyProperty.RegisterAttached(
        "DragPosition", typeof(Point), typeof(LogViewHeaderPanel),
        new FrameworkPropertyMetadata(
            new Point(), FrameworkPropertyMetadataOptions.AffectsParentArrange));

您正在
\u currentlyActiveColumnHeader
上设置
DragPosition
属性,我猜它不是
LogViewHeaderPanel
。虽然我不确定它在这里是否重要,但是对于这种使用,您必须将
DragPosition
注册为附加属性。只需将
DependencyProperty.Register
替换为
DependencyProperty.RegisterAttached
。还要注意:
通常,您不需要使用AffectsParentArrange将FrameworkElement属性的更改报告给父元素,因为元素本身已经将其自己的AffectsArrange设置为true。这通常就足够了,因为子元素中的更改通常会在适当的时候启动父元素排列。
@Clemens感谢您的帮助。该属性仅用于面板的布局目的,它不会影响子级本身上的任何其他属性,而子级本身可能会传播布局更改。我正在使用这种技术进行“可视化”拖放,类似于在浏览器选项卡上移动,内置的DoDragDrop和Adorner功能(据我所知)不会提供相同的视觉效果。还是我完全走错了路?看起来不是完全走错了路。我将写下注册的东西作为答案,这样问题就可以标记为已回答。