2013-07-24 55 views
0

我有一个自定义面板,它定义了这个依赖属性:的DependencyProperty变化不会触发安排

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

注:我已经试过FrameworkPropertyMetadataOptions.AffectsArrange以及...

那LogViewHeaderPanel是我自定义ItemsControl的面板,名为LogViewHeader。它的项目是ColumnHeader类型。当鼠标移动,和其他一些条件的LogViewHeader内满足,目标的columnHeader具有使用下面的代码的属性设置:

_currentlyActiveColumnHeader.SetValue(
    LogViewHeaderPanel.DragPositionProperty, 
    new Point(suggestedXPosition, originalPosition.Y) 
); 

如果我把一个断点在我的修调LogViewHeaderPanel.ArrangeOverride,我可以看到它在LogViewHeader被创建/调整大小时被调用,但在DragPosition属性设置为子级时不会被调用。

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

+2

要设置在'_currentlyActiveColumnHeader'的'DragPosition'财产,我的猜测是不是'LogViewHeaderPanel'。尽管我不确定这里是否重要,但您必须将'DragPosition'注册为此类用途的附加属性。只需用'DependencyProperty.RegisterAttached'替换'DependencyProperty.Register'。 – Clemens

+0

另请注意[Remarks here](http://msdn.microsoft.com/en-us/library/system.windows.frameworkpropertymetadata.affectsparentarrange.aspx):'通常,您不需要报告FrameworkElement的更改属性添加到使用AffectsParentArrange的父元素,因为元素本身已经有自己的AffectsArrange为true。这通常是足够的,因为子元素的变化通常会在适当的时候启动父母安排。“# – Clemens

+0

@Clemens谢谢你的工作。该属性仅用于面板的布局目的,它不会影响子本身上的任何其他属性,然后可能会传播布局更改。我正在使用这种技术做一个“可视化”的拖放操作,就像移动浏览器标签一样,内置的DoDragDrop和Adorner功能都不会(据我所知)给出相同的视觉效果。或者,我是否完全用错误的方式去谈论这个问题? – Lee

回答

1

您在_currentlyActiveColumnHeader上设置DragPosition属性,该属性不是LogViewHeaderPanel。对于这种用途,您必须将DragPosition注册为attached property

通过DependencyProperty.RegisterAttached只需更换DependencyProperty.Register

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