2013-03-27 69 views
0

iv'e了從堆疊面板派生的自定義面板VerticalAlignment爲ItemsPanel

此板具有依賴於面板的垂直對齊

CS的佈局的邏輯:

public class ReArrangeStackPanel : StackPanel 
    {  
    protected override Size ArrangeOverride(Size arrangeSize) 
    { 
     double delta = this.VerticalAlignment == System.Windows.VerticalAlignment.Bottom 
           ? CalcForBottom() : CalcForTop();       

     ChildrenArrangement(delta); 

     return base.ArrangeOverride(arrangeSize); 
    } 

1)我會期望ItemsPanel的VerticalAligment屬性繼承 它是它的孩子的項目控制,它似乎沒有,因爲它設置了默認的 「拉伸」值。 2)即使在ItemsPanel上明確設置VerticalAlignment時,如果我沒有硬編碼值 VerticalAlignment在ArrangeOverride範圍中設置爲「Stretch」,並且僅在後面(我使用snoop觀察時)設置與「底部」值。

XAML:

一)不工作:與結合,該值設置,但只有ArrangeOverride後。

<Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <local:ReArrangeStackPanel 
         VerticalAlignment="{Binding Path=VerticalAlignment, 
         RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:PipeControl}}}" /> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 

b)作品:明確硬編碼值。

<ItemsPanelTemplate> 
     <local:ReArrangeStackPanel VerticalAlignment="Bottom" /> 
    </ItemsPanelTemplate> 

在我的Windows XAML ItemsControl的(PipeControl)設置與希望VerticalAlignment。

所以我的問題:

1)爲什麼值不繼承?

2)爲什麼在ArrangeOverride發生之前未通過綁定設置值?

在此先感謝。

+0

也許是因爲[DataBind在Render之前運行](http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherpriority。aspx),並且該值不會被設置,直到父級被渲染,因爲通常WPF控件的默認大小調整大小是基於父面板?你可以在你的'VerticalAlignment'綁定中放入一個Converter,並檢查它在首次評估時的界限值。 – Rachel 2013-03-27 16:08:57

+0

@Rachel謝謝,ArrangeOverride是在Converter之前到達的。 ,答案編號2。 任何想法爲什麼它沒有繼承價值第一 看到的是,他們都是其中一個是另一個的孩子的框架元素? – 2013-03-27 16:14:19

+0

如果你註釋掉你的'ArrangeOverride'方法,或者添加'base.ArrangeOverride()',它的值是否被繼承?可能默認值實際上是在'ArrangeOverride'方法中設置的,並且您正在覆蓋該方法。 – Rachel 2013-03-27 16:22:15

回答

0

FrameworkElement.VerticalAlignment的默認值是Stretch,因此它是有道理的,你ReArrangeStackPanel.VerticalAlignment類的默認值也Stretch

由於上漿WPF的典型風格控件通常是基於父面板上,這是可能的的ArrangeOverride方法實際上是爲StackPanel設置VerticalAlignment屬性,並且您正在覆蓋該方法。

如果事實確實如此,那麼你可以確保默認設置由您ArrangeOverride()方法調用base.ArrangeOverride()設置正確

protected override Size ArrangeOverride(Size arrangeSize) 
{ 
    base.ArrangeOverride(arrangeSize); 

    ... 
} 

至於爲什麼約束力不工作,我懷疑這是因爲Rendering occurs after DataBinding,所以VerticalAlignment屬性不會被設置,直到您綁定到的父控件已被渲染。

您可以通過將Converter放入您的VerticalAlignment綁定中來驗證是否屬於這種情況,並檢查評估值時的值。

相關問題