スタック パネルから派生したカスタム パネルを取得しました
このパネルには、パネルの垂直方向の配置に依存するレイアウト ロジックがあります
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 プロパティが、子である項目コントロールから継承されることを期待しますが、デフォルトの "Stretch" Value で設定されているため、そうではないようです。
2) ItemsPanel で VerticalAlignment を明示的に設定する場合でも、値をハードコーディングしない場合、VerticalAlignment は ArrangeOverride スコープで「Stretch」に設定され、後でのみ (スヌープを使用して観察します)、「Bottom」で設定されます価値 。
XAML :
a) 機能しません: binding では、値は設定されますが、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 が発生する前にバインディングを介して値が設定されないのはなぜですか?
前もって感謝します 。