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發生之前未通過綁定設置值?
在此先感謝。
也許是因爲[DataBind在Render之前運行](http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherpriority。aspx),並且該值不會被設置,直到父級被渲染,因爲通常WPF控件的默認大小調整大小是基於父面板?你可以在你的'VerticalAlignment'綁定中放入一個Converter,並檢查它在首次評估時的界限值。 – Rachel 2013-03-27 16:08:57
@Rachel謝謝,ArrangeOverride是在Converter之前到達的。 ,答案編號2。 任何想法爲什麼它沒有繼承價值第一 看到的是,他們都是其中一個是另一個的孩子的框架元素? – 2013-03-27 16:14:19
如果你註釋掉你的'ArrangeOverride'方法,或者添加'base.ArrangeOverride()',它的值是否被繼承?可能默認值實際上是在'ArrangeOverride'方法中設置的,並且您正在覆蓋該方法。 – Rachel 2013-03-27 16:22:15