0

スタック パネルから派生したカスタム パネルを取得しました

このパネルには、パネルの垂直方向の配置に依存するレイアウト ロジックがあります

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 が発生する前にバインディングを介して値が設定されないのはなぜですか?

前もって感謝します 。

4

1 に答える 1

0

FrameworkElement.VerticalAlignmentのデフォルト値はであるため、クラスStretchのデフォルト値も であることは理にかなっていますReArrangeStackPanel.VerticalAlignmentStretch

通常、WPF コントロールのサイズ変更の典型的なスタイルは親パネルに基づいているため、a のメソッドが StackPanel のプロパティを実際に設定するものであり、そのメソッドを上書きしている可能ArrangeOverride性がありますStackPanelVerticalAlignment

これが実際に当てはまる場合は、メソッドを呼び出してデフォルトが正しく設定されていることを確認base.ArrangeOverride()できArrangeOverride()ます

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

    ...
}

バインディングが機能しない理由については、Rendering が DataBinding の後に発生するためと思われるため、バインドVerticalAlignment先の親コントロールが Rendered になるまでプロパティは設定されません。

Converterこれが当てはまるかどうかは、VerticalAlignmentバインディングに a を入れて、評価されたときの値をチェックすることで確認できます。

于 2013-03-27T16:28:45.070 に答える