2009-02-12 32 views
3

我想創建一個窗口選項卡的WPF控件,並且我希望它具有特定的形狀。像這樣的東西;如何創建一個在地方延伸的WPF路徑

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

所以左下角和右下角的小標籤是固定大小;大概6x6。但是現在我希望中心部分伸展到任何容器的寬度。

此刻我正在使用Path對象,但我無法弄清楚如何獲得伸展部分,或者即使Path是正確的路徑。

任何人都可以建議創建這種半可拉伸形狀的最佳方式?

回答

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。

3

爲什麼不創建兩個不同的小部件?一個用於中心部分,另一個用於可拉伸部分。然後將它們粘在另一個容器中以形成統一的控制。

+0

不幸的是,我不得不把一個複雜的填充到形狀,並圍繞它。三個控件將有三個不同的筆劃,並且填充將嚴重對齊。 – 2009-02-12 14:34:58

2

我想你應該重寫控件中的MeasureOverride方法並獲取內容的DesiredSize(通過調用Content/Children的Measure方法)。然後,您可以根據此大小創建您的路徑。