Как получить ширину столбца в сетке WPF с помощью GridSplitter? - PullRequest
0 голосов
/ 14 декабря 2011

Мне нужно отобразить пользователю два списка - по одному с каждой стороны окна - и позволить пользователю выбирать, сколько экранного пространства отводится каждому.Я добился этого с помощью следующего кода:

<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding FirstColumnWidth}" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <ListBox Name="FirstColumn" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0" Grid.Column="0" />
    <GridSplitter Name="gridSplitter1" Width="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0" Grid.Column="1" />
    <ListBox Name="SecondColumn" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0" Grid.Column="2" />
</Grid>

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

В идеале, решение должно хорошо работать с MVVM - я использую Caliburn и стараюсь сохранить код максимально чистым (моя модель представлениясодержит свойство FirstColumnWidth, которое в настоящее время связано).

1 Ответ

0 голосов
/ 14 декабря 2011

Есть два решения, о которых я могу подумать.

1. Используйте различные доступные режимы привязки и свойства Width и ActualWidth.

Пример

<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding Path=FirstColumnWidth, Mode=OneTime}" />
        <ColumnDefinition Width="3" />
        <ColumnDefinition Width="{Binding Path=SecondColumnWidth, Mode=OneTime}" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid Grid.Column="0" ActualWidth="{Binding Path=FirstColumnWidth, Mode=OneWayToSource}">
        <ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </Grid>
    <GridSplitter Grid.Column="1" Width="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    <Grid Grid.Column="2" ActualWidth="{Binding Path=SecondColumnWidth, Mode=OneWayToSource}">
        <ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </Grid>
</Grid>

или 2. Переопределить текущее / заданное по умолчанию поведение разделителя сетки, используя прикрепленный шаблон поведения ( учебник по CodeProject ). Я опубликую пример кода для этого завтра, когда я буду за столом.

...