3

ウィンドウ タブ用の WPF コントロールを作成したいのですが、特定の形状にしたいと考えています。このようなもの;

      +------------------------------+
      |                              |
*     |                              |
      |                              |
   +--+                              +--+
6  |                                    |  6
   +------------------------------------+   
     6       stretching section       6

したがって、左下と右下の小さなタブは固定サイズです。およそ6x6。しかし今、私はそれを平手打ちしたコンテナの幅に合わせて中央のセクションを伸ばしたいと思っています.

現在、Path オブジェクトを使用していますが、ストレッチ セクションを取得する方法がわかりません。また、Path が正しい方法であるかどうかもわかりません。

この種の半分伸縮可能な形状を作成する最良の方法を提案できる人はいますか?

4

3 に答える 3

3

StackPanel から継承する「StretchStackPanel」を作成して、アプリのストレッチ部分を行いました。クラスは次のようになります。

public class StretchStackPanel : StackPanel
{
    public static DependencyProperty StretchDependencyProperty = DependencyProperty.Register("Stretch", typeof(StretchMode), typeof(StretchStackPanel));

    protected override Size MeasureOverride(Size availableSize)
    {
        var baseSize = base.MeasureOverride(availableSize);

        if (availableSize.Width != double.PositiveInfinity && (Stretch & StretchMode.Horizontal) == StretchMode.Horizontal )
        {
            baseSize.Width = availableSize.Width;    
        }
        if (availableSize.Height != double.PositiveInfinity && (Stretch & StretchMode.Vertical) == StretchMode.Vertical)
        {
            baseSize.Height = availableSize.Height;
        }

        return baseSize;
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        var baseSize = base.ArrangeOverride(finalSize);

        if ((Stretch & StretchMode.Horizontal) == StretchMode.Horizontal )
        {
            baseSize.Width = finalSize.Width;    
        }

        if ((Stretch & StretchMode.Vertical) == StretchMode.Vertical)
        {
            baseSize.Height = finalSize.Height;
        }
        return baseSize;
    }

    [Category("Layout")]
    public StretchMode Stretch
    {
        get
        {
            return (StretchMode)GetValue(StretchDependencyProperty);
        }
        set
        {
            SetValue(StretchDependencyProperty, value);
        }
    }
}

必要なのは、2 行のグリッドです。一番上の行のコンテンツは、水平方向の配置が中央に設定されている必要があります。一番下の行のコンテンツは StretchStackPanel である必要があります。

于 2009-02-12T12:37:21.467 に答える
3

2 つの異なるウィジェットを作成してみませんか? 1 つは中央セクション用、もう 1 つは伸縮セクション用です。次に、それらを別のコンテナーに貼り付けて、統合されたコントロールを形成します。

于 2009-02-12T12:26:16.313 に答える
2

コントロールの MeasureOverride メソッドをオーバーライドし、コンテンツの DesiredSize を取得する必要があると思います (Content/Children で Measure メソッドを呼び出して)。次に、このサイズに基づいてパスを作成できます。

于 2009-02-12T15:46:00.687 に答える