Как я могу получить регулируемые "рамки" в WPF? - PullRequest
3 голосов
/ 03 марта 2012

Я знаю, что у меня есть несколько вариантов, когда нужно разделить окно на отдельные секции (например, DockPanel, StackPanel и т. Д.).Мое приложение Windows требует, чтобы пользователь мог регулировать размер различных разделов во время выполнения, подобно тому, как пользователь может настраивать ширину FRAME в HTML.У кого-нибудь есть предложения относительно того, какой тип / типы элементов управления использовать для достижения этой цели в C # WPF?Если у вас есть какой-либо код, который бы иллюстрировал, как пользователь может навести курсор мыши на границу раздела и нажать и удерживать, чтобы настроить размер, это было бы идеально.

Ответы [ 2 ]

5 голосов
/ 03 марта 2012

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 голосов
/ 04 сентября 2014

Вот пример программного создания кадров в любом направлении.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...