2012-03-03 4 views
3

ウィンドウを別々のセクション(DockPanel、StackPanelなど)に分割するときに使用するオプションがいくつかあります。私のWindowsアプリケーションでは、ユーザーが実行時にさまざまなセクションのサイズを調整できる必要があります。これは、ユーザーがHTMLでFRAME幅を調整できる方法と似ています。誰もがC#WPFでこれを達成するために使用するコントロールのタイプ/タイプの提案はありますか?ユーザーがどのようにセクション境界にマウスを乗せてクリックしてサイズを調整するかを示すコードがあれば理想的です。WPFで調整可能な「フレーム」を取得するにはどうすればよいですか?

答えて

5

System.Windows.Controls.GridSplitter

http://msdn.microsoft.com/en-us/library/system.windows.controls.gridsplitter.aspx

例:

<Grid VerticalAlignment="Stretch"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="50" /> 
     <RowDefinition Height="5" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <ListBox Grid.Row="0" > 
     <TextBlock>Hello</TextBlock> 
    </ListBox> 

    <GridSplitter Grid.Row="1" 
     Height="5" Background="Gray" 
     VerticalAlignment="Top" 
     HorizontalAlignment="Stretch" /> 

    <ListBox Grid.Row="2" > 
     <TextBlock>World</TextBlock>    
    </ListBox> 
</Grid> 
0

ここでいずれの方向にも、プログラムでフレームを作る例です。

var topTB = new TextBox(); 
var middleTB = new TextBox(); 
var bottomTB = new TextBox(); 

var g = MakeSideBySideFrames(this.Root, topTB, middleTB, bottomTB); 
g.Height = 300.0; 

public Grid MakeTopBottomFrames(Panel parent, params UIElement[] items) 
{ 
    return MakeFrames(parent, 
     newPosition: (g, len) => { g. RowDefinitions.Add(new RowDefinition { Height = len }); }, 
     setPosition: (item, inx) => { Grid.SetRow(item, inx); }, 
     items: items); 
} 
public Grid MakeSideBySideFrames(Panel parent, params UIElement[] items) 
{ 
    return MakeFrames(parent, 
     newPosition: (g, len) => { g.ColumnDefinitions.Add(new ColumnDefinition { Width = len }); }, 
     setPosition: (item, inx) => { Grid.SetColumn(item, inx); }, 
     items: items); 
} 
Grid MakeFrames(Panel parent, 
     Action<Grid, GridLength> newPosition, 
     Action<UIElement, int> setPosition, 
     params UIElement[] items 
    ) 
{ 
    var g = new Grid(); 
    parent.Children.Add(g); 

    for (var inx = 0; inx < items.Length; inx++) 
    { 
     if (inx > 0) 
     { 
      newPosition(g, new GridLength(5)); 

      var gs = new GridSplitter(); 
      g.Children.Add(gs); 
      setPosition(gs, (inx * 2) - 1); 
      gs.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch; 
      gs.VerticalAlignment = System.Windows.VerticalAlignment.Stretch; 
      gs.Background = new SolidColorBrush(Colors.Black); 
      gs.ShowsPreview = true; 
     } 

     newPosition(g, new GridLength(1, GridUnitType.Star)); 
     g.Children.Add(items[inx]); 
     setPosition(items[inx], inx * 2); 
    } 

    return g; 
} 
関連する問題