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功能(据我所知)不会提供相同的视觉效果。还是我完全走错了路?看起来不是完全走错了路。我将写下注册的东西作为答案,这样问题就可以标记为已回答。