我如何在WPF中获得可调整的“框架”?

3

我知道在将窗口分割成不同的部分时,有几种选择可供使用(例如DockPanel,StackPanel等)。我的Windows应用程序要求用户能够在运行时调整不同部分的大小,类似于用户可以调整HTML中FRAME宽度的方式。有人有什么建议,在C#WPF中使用哪种类型的控件来完成这个任务?如果您有任何代码示例,演示如何在鼠标悬停在部分边界并单击保持以调整大小,那将是理想的。

2个回答

7

System.Windows.Controls.GridSplitter

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

Example:

<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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接