Проблема WPF SharedSizeGroup GridSplitter

Я хочу использовать сетку для макета верхнего уровня. Сетка будет иметь 1 столбец и n строк. Каждая строка в сетке также должна содержать сетку, которая должна иметь 3 столбца и 1 строку. Во втором столбце находится GridSplitter, и я пытаюсь использовать SharedSizeGroup, чтобы изменить размер первого столбца во всех вложенных сетках.

Вот что у меня есть... и это работает!!... ну вроде... если вы нажмете разделитель и измените размер, не отпуская его, это сработает... но по какой-то причине, если вы измените размер чего-либо и отпустите мыши, а затем попытаться изменить размер, используя другую строку, которая, кажется, «прилипает».

Любые идеи?

<!-- Parent Grid -->
<Grid Grid.IsSharedSizeScope="True">
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>

    <!-- First Grid -->
    <Grid Grid.Row="0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition SharedSizeGroup="A" Width="Auto"></ColumnDefinition>
            <ColumnDefinition SharedSizeGroup="B" Width="Auto"></ColumnDefinition>
            <ColumnDefinition SharedSizeGroup="C" Width="Auto"></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <Label Grid.Column="0">One-Left</Label>
        <GridSplitter Grid.Column="1" Width="5" Background="DarkGray"></GridSplitter>
        <Label Grid.Column="2">One-Right</Label>
    </Grid>

    <!-- Second Grid -->
    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition SharedSizeGroup="A" Width="Auto"></ColumnDefinition>
            <ColumnDefinition SharedSizeGroup="B" Width="Auto"></ColumnDefinition>
            <ColumnDefinition SharedSizeGroup="C" Width="Auto"></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <Label Grid.Column="0">Two-Left</Label>
        <GridSplitter Grid.Column="1" Width="5" Background="DarkGray"></GridSplitter>
        <Label Grid.Column="2">Two-Right</Label>
    </Grid>

</Grid>

person pmcilreavy    schedule 11.11.2009    source источник
comment
Также попробовал это в бета-версии 2 VS2010 с .net 4.0 и получил ту же проблему.   -  person pmcilreavy    schedule 11.11.2009
comment
Если это так, вам следует немедленно сообщить об этой ошибке в Microsoft Connect. Есть шанс, что в 4.0 это исправят!!!   -  person Drew Marsh    schedule 11.11.2009
comment
попробуйте использовать gridplitter для всех ваших подсеток, посмотрите мой ответ, надеюсь, это поможет   -  person punker76    schedule 05.12.2011
comment
Кажется, это происходит, когда существует более одного разветвителя сетки, ячейки сетки которого являются частью области одного размера.   -  person Ugo Robain    schedule 16.03.2013


Ответы (3)


Репост моего ответа от ms connect:

Обычно вы можете обойти это, не используя SharedSizeGroup и вместо этого привязывая все общие размеры к одному свойству одного объекта (например, вашего контекста данных):

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication3"
        Height="350" Width="525" Title="MainWindow">

    <Window.DataContext>
        <my:MainWindowData Width0="1*" Width1="1*" />
    </Window.DataContext>

    <Window.Resources>

        <DataTemplate x:Key="dt">
         <Grid>
            <Grid.ColumnDefinitions>
             <ColumnDefinition Width="{Binding Path=Width0, Mode=TwoWay}" />
             <ColumnDefinition Width="Auto" />
             <ColumnDefinition Width="{Binding Path=Width1, Mode=TwoWay}" />
            </Grid.ColumnDefinitions>
            <Button Grid.Column="0" Content="{Binding Width0}" />
            <GridSplitter Grid.Column="1" Width="10" ResizeBehavior="PreviousAndNext" ResizeDirection="Columns" />
            <Button Grid.Column="2" Content="{Binding Width1}" />
         </Grid>
        </DataTemplate>

    </Window.Resources>

    <StackPanel>
        <ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource dt}" />
        <ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource dt}" />
    </StackPanel>

</Window>

Где Width0 и Width1 имеют соответствующий тип (GridLength). Он работает с любым размером (фиксированным, звездочкой и автоматическим) в любой комбинации.

ОБНОВЛЕНИЕ:

В качестве альтернативы и, возможно, лучше, вместо привязки к DataContext вы можете сделать это исключительно в XAML. Просто определите одну основную сетку (не обязательно родительскую, но вам нужен какой-то способ сослаться на нее) с именованными столбцами, а затем привяжите их по имени.

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="350" Width="525" Title="MainWindow">

    <!-- shared sizing used only on fixed size columns therefore safe -->
    <!-- alternatively you can hardcode width of splitter column -->
    <Grid Name="masterGrid" Grid.IsSharedSizeScope="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" Name="masterColumn0" />
            <ColumnDefinition Width="Auto" SharedSizeGroup="masterColumn1" />
            <ColumnDefinition Width="1*" Name="masterColumn2" />
        </Grid.ColumnDefinitions>
        <StackPanel Grid.ColumnSpan="3">
            <StackPanel.Resources>
                <DataTemplate x:Key="dt">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="{Binding Path=Width, Mode=TwoWay, ElementName=masterColumn0}" />
                            <ColumnDefinition Width="Auto" SharedSizeGroup="masterColumn1" />
                            <ColumnDefinition Width="{Binding Path=Width, Mode=TwoWay, ElementName=masterColumn2}" />
                        </Grid.ColumnDefinitions>
                        <Button Grid.Column="0" Content="{Binding Path=Width, Mode=TwoWay, ElementName=masterColumn0}" />
                        <Button Grid.Column="2" Content="{Binding Path=Width, Mode=TwoWay, ElementName=masterColumn2}" />
                    </Grid>
                </DataTemplate>
            </StackPanel.Resources>
            <ContentPresenter ContentTemplate="{StaticResource dt}" />
            <ContentPresenter ContentTemplate="{StaticResource dt}" />
        </StackPanel>
        <GridSplitter Grid.Column="1" Width="10" ResizeBehavior="PreviousAndNext" ResizeDirection="Columns" ShowsPreview="True" />
    </Grid>

</Window>

Это дает дополнительное преимущество использования единого разделителя сетки, используемого всеми сетками.

person Marcin Wisnicki    schedule 26.06.2012

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

person Drew Marsh    schedule 11.11.2009
comment
Спасибо за ответ. Это то, о чем я как бы думал. Кажется, это должно работать, и вроде как работает... но также совершенно не работает. Это сводит меня с ума!! - person pmcilreavy; 11.11.2009

попробуйте это решение, если оно вас устраивает (в Kaxaml оно работает нормально).

<!-- Parent Grid -->
<Grid Grid.IsSharedSizeScope="True">

  <Grid.RowDefinitions>
    <RowDefinition></RowDefinition>
    <RowDefinition></RowDefinition>
  </Grid.RowDefinitions>

  <Grid.ColumnDefinitions>
    <ColumnDefinition SharedSizeGroup="A" Width="Auto"></ColumnDefinition>
    <ColumnDefinition Width="Auto"></ColumnDefinition>
    <ColumnDefinition SharedSizeGroup="C" Width="Auto"></ColumnDefinition>
  </Grid.ColumnDefinitions>

  <Label Grid.Column="0" Grid.Row="0">One-Left</Label>
  <Label Grid.Column="0" Grid.Row="1">Two-Left</Label>
  <GridSplitter Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Width="5" Background="DarkGray"></GridSplitter>
  <Label Grid.Column="2" Grid.Row="0">One-Right</Label>
  <Label Grid.Column="2" Grid.Row="1">Two-Right</Label>

</Grid>

Надеюсь это поможет

person punker76    schedule 05.12.2011