2017-04-19 6 views
-2

WPFでinbuiltパネルまたはコンテナのいずれかを使用して、子アイテムを希望の最小サイズの比率で幅を埋めるようにする方法はありますか。WPFで最小サイズの子を展開する

たとえば、最後の子フィルがオフになっているドックパネルがある場合、最初のイメージのような結果が得られます。これらの要素を水平に伸ばして、2番目の画像を実現するにはどうすればよいですか?

Desired layout

+1

あなたは「スター」のサイジングでグリッドを使用しますhttp://stackoverflow.com/questions/1768293/what-does-the-wpf-star-do-width-100。最小サイズで動作させるには、コントロールの最小サイズをグリッド列の幅に合わせるために、コードビハインドをトリッキーにしなければならないでしょう。 – vesan

+0

申し訳ありませんが、指定する必要があります。コレクションに任意の数のアイテムがあります。 – Hugoagogo

+0

その場合は、アイテムを追加するときにGridのColumnDefinitionsを動的に生成する必要があります。あなたが必要とするように他のパネルがサイズ変更を行うとは思わない。いくつかの点で[この質問](http://stackoverflow.com/questions/9000549/how-can-i-dynamically-add-a-rowdefinition-to-a-grid-in-an-itemspaneltemplate)をチェックすることができます動的に行を生成します(列の場合は同じものになります)。 – vesan

答えて

0

私はそれがカスタムパネルを書くことだと思ったより道簡単ですが判明。使いやすい形でこれのようなものを後にしている人のために。このため通常は

public class StretchPanel : Panel 
{ 
    protected override Size MeasureOverride(Size availableSize) 
    { 
     Size size = new Size(0, 0); 

     foreach (UIElement child in Children) 
     { 
      child.Measure(availableSize); 
      size.Width += child.DesiredSize.Width; 
      size.Height = Math.Max(size.Height, child.DesiredSize.Height); 
     } 

     size.Width = double.IsInfinity(availableSize.Width) ? 
      size.Width : availableSize.Width; 

     size.Height = double.IsInfinity(availableSize.Height) ? 
      size.Height : availableSize.Height; 

     return size; 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     double total = 0; 

     foreach (UIElement child in Children) total += child.DesiredSize.Width; 

     double x = 0; 

     double factor = Math.Max(finalSize.Width/total,1); 

     foreach (UIElement child in Children) 
     { 
      double adjusted_width = child.DesiredSize.Width * factor; 
      child.Arrange(new Rect(x, 0, adjusted_width, finalSize.Height)); 
      x += adjusted_width; 
     } 

     return finalSize; 
    } 
} 
関連する問題