2009-11-11 2 views
6

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

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

Любые идеи?

<!-- 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> 
+0

Вы также попробовали это в VS2010 beta 2 с .net 4.0 и получили ту же проблему. – pmcilreavy

+0

Если это так, вы должны немедленно сообщить об этой ошибке в Microsoft Connect. Есть еще шанс, что они могут исправить это в 4.0! –

+0

попробуйте использовать gridplitter над всеми вашими субгридами, посмотрите на мой ответ, надеюсь, что это поможет. – punker76

ответ

9

перепроведение моего ответа от ms connect:.

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

<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). Он работает с любым типом калибровки (фиксированным, звездой и авто) в любой комбинации.

UPDATE:

В качестве альтернативы и, возможно, лучше, вместо того, чтобы связываться с 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> 

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

2

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

+0

Спасибо, что ответили. Вот что я подумал. Кажется, это похоже на то, что он должен работать, и что-то вроде ... но и полностью нет. Его вождение меня орехи !! – pmcilreavy

1

попробуйте это решение, если это нормально для вас (в 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> 

Надеется, что это помогает

Смежные вопросы