Как сделать так, чтобы WPF GridSplitter не изменял размер моей сетки?

WPF GridSplitter делает мою сетку шире, чем мое окно!

У меня есть сетка WPF с GridSplitter. Если я изменю размер своих столбцов, я могу сделать сетку шире, чем мое окно, и сделать ее невидимой.

Начинается это так:

Сетка WPF http://img201.imageshack.us/img201/9505/onehg6.jpg

Но после расширения левого столбца я больше не вижу правый столбец (зеленый):

WPF GridSplitter http://img201.imageshack.us/img201/1804/twomy6.jpg

Что я делаю не так? Как сделать так, чтобы GridSplitter не изменял размер моей сетки?


Обновлять:

Я все еще борюсь с этим. Теперь я пробовал вкладывать сетки в сетки. Это не помогло. Вот мои XAML ColumnDefinitions, RowDefinitions и GridSplitters ...

<Window ... >
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width = "*" MinWidth = "150" />
            <ColumnDefinition Width = "Auto" />
            <ColumnDefinition Width = "*" MinWidth = "400" />
        </Grid.ColumnDefinitions>
        <GridSplitter 
            ResizeDirection = "Columns"
            ResizeBehavior = "BasedOnAlignment"
            Grid.Column = "1"
            HorizontalAlignment = "Center"
            VerticalAlignment = "Stretch"
            Width = "2"
            Margin = "0,5,0,5"
            Panel.ZIndex = "1"/>
        <Grid Grid.Column = "0">
            ...
        </Grid>
        <Grid Grid.Column = "2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width = "*" MinWidth = "150" />
                <ColumnDefinition Width = "Auto" />
                <ColumnDefinition Width = "*" MinWidth = "200" />
            </Grid.ColumnDefinitions>
            <GridSplitter 
                ResizeDirection = "Columns"
                ResizeBehavior = "PreviousAndNext"
                Grid.Column = "1"
                HorizontalAlignment = "Center"
                VerticalAlignment = "Stretch"
                Width = "2"
                Margin = "0,5,0,5"
                Panel.ZIndex = "1"/>
            <Grid Grid.Column = "0">
                ...
            </Grid>
            <Grid Grid.Column = "2">
                ...
            </Grid>
        </Grid>
    </Grid>
</Window>

Обновлять:

Я думаю, проблема в элементе управления WebBrowser. См. Новый вопрос:

WPF GridSplitter не работает с элементом управления WebBrowser?

Установлено ли у вашего окна MaxWidth?

BrainSlugs83 01.11.2013 06:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
1
25 584
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Попробуйте изменить ширину на звездочки. Это приведет к тому, что разделитель изменит размер только столбцов, между которыми он находится, поэтому не уверен, что это ваше желаемое поведение. Однако при размерах звездочки содержимое не вырастет за пределы окна.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width = "2*" MinWidth = "100" />
        <ColumnDefinition Width = "Auto" />
        <ColumnDefinition Width = "*" MinWidth = "50" />
        <ColumnDefinition Width = "2*" MinWidth = "100" />
        <ColumnDefinition Width = "Auto" />
        <ColumnDefinition Width = "3*" MinWidth = "150" />
    </Grid.ColumnDefinitions>
    <GridSplitter 
        ResizeDirection = "Columns"
        Grid.Column = "1"
        Grid.RowSpan = "8"
        HorizontalAlignment = "Center"
        VerticalAlignment = "Stretch"
        Width = "2"
        Margin = "0,5,0,5"
        Panel.ZIndex = "1"/>
    ...
</Grid>

Это решило проблему для меня. Колонны по обе стороны от разделителя должны были быть звездообразными.

Joshua Tacoma 07.05.2010 16:43
Ответ принят как подходящий

Если размер вашего окна изменен так, что его ширина меньше суммы MinWidths ваших столбцов, вы увидите, что столбцы обрезаны, но в противном случае я не могу воспроизвести вашу проблему:

<Window xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:sys = "clr-namespace:System;assembly=mscorlib"
        xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth = "150" Width = "*"/>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition MinWidth = "400" Width = "*"/>
        </Grid.ColumnDefinitions>
        <GridSplitter
            Width = "2"
            Grid.Column = "1"
            HorizontalAlignment = "Center"
            Margin = "0,5,0,5"
            Panel.ZIndex = "1"
            VerticalAlignment = "Stretch"
            ResizeBehavior = "BasedOnAlignment"
            ResizeDirection = "Columns"/>
        <Grid Grid.Column = "0">
            <Border Background = "Red" Margin = "5"/>
        </Grid>
        <Grid Grid.Column = "2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition MinWidth = "150" Width = "*"/>
                <ColumnDefinition Width = "Auto"/>
                <ColumnDefinition MinWidth = "200" Width = "*"/>
            </Grid.ColumnDefinitions>
            <GridSplitter
                Width = "2"
                Grid.Column = "1"
                HorizontalAlignment = "Center"
                Margin = "0,5,0,5"
                Panel.ZIndex = "1"
                VerticalAlignment = "Stretch"
                ResizeBehavior = "PreviousAndNext"
                ResizeDirection = "Columns"/>
            <Grid Grid.Column = "0">
                <Border Background = "Green" Margin = "5"/>
            </Grid>
            <Grid Grid.Column = "2">
                <Border Background = "Blue" Margin = "5"/>
            </Grid>
        </Grid>
    </Grid>
</Window>

При расширении красного столбца он будет расширяться только до тех пор, пока правый столбец не достигнет минимальной ширины 400, он не будет загружать его со страницы.

Возможно, вы устанавливаете другие свойства окна или самой внешней сетки, которые могут вызвать такое поведение ...

Я заставил это работать, установив произвольно высокие значения MaxWidth для столбцов, отличных от веб-браузера, как вы продемонстрировали в этом другом вопросе: stackoverflow.com/questions/375841/… <ColumnDefinition ... MaxWidth = "10000" />

Zack Peterson 18.12.2008 21:44

Захват события DragDelta - еще один способ сделать это:

    private void VerticalGridSplitter_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
    {
        if (GridName.ColumnDefinitions[2].Width.Value < 400)
        {
            GridName.ColumnDefinitions[2].Width = new GridLength(400);
        }
    }

Но использование MinWidth в * ColumnDefinition должно работать нормально. Обратите внимание, что ColumnDefinition с MinWidth должен находиться на верхнем уровне. Не работает, если он вложен в какую-то сетку внутри столбца.

Это работает для меня без дополнительного кода, когда между разделителями нет столбцов с автоматической шириной, то есть:

<Grid >
<Grid.ColumnDefinitions>
    <ColumnDefinition Width = "20*" MinWidth = "50" MaxWidth = "500" />
    <ColumnDefinition Width = "Auto"/> <!-- Remove such columns /-->
    <ColumnDefinition Width = "100*" MinWidth = "850"/>
    <ColumnDefinition Width = "30*" MinWidth = "50" MaxWidth = "800" />
</Grid.ColumnDefinitions>
...
<GridSplitter HorizontalAlignment = "Right" Width = "3"/>
...
<GridSplitter Grid.Column = "3" HorizontalAlignment = "Left" Width = "3" />
<!-- Assign Grid.Column to 2 if you remove the auto width column /-->
...
</Grid>

В противном случае размер сетки будет изменяться.

У меня тоже была эта проблема с обычным Grid без специальных элементов управления и размером * в обоих столбцах / строках.

Проблема оказалась в том, что я программно установил ширину и высоту столбцов / строк в сетке после загрузки окна, потому что я сохраняю положение разделителя, чтобы восстановить его при следующем запуске программы.

Я изменил его на расчет размера *, чтобы решить проблему.

Другие вопросы по теме