2009-11-11 36 views
6

我希望用一个网格为我的顶层布局。网格将有1列和n行。网格中的每一行还应包含一个网格,网格应包含3列和1行。在第二列是一个GridSplitter,我试图使用一个SharedSizeGroup,这样就改变了所有嵌套网格中第一列的大小。WPF SharedSizeGroup GridSplitter问题

这里是我有...和它的作品!......好样的......如果你单击该分离器和不放它的工作原理调整...但由于某种原因,如果调整的东西,放开鼠标,然后尝试使用不同的行来调整大小,似乎“粘住”。

任何想法?

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

还与.NET 4.0试过这个在VS2010 Beta 2中,并得到了同样的问题。 – pmcilreavy 2009-11-11 14:11:25

+0

如果是这种情况,应立即在Microsoft Connect上报告此错误。他们仍然有机会在4.0中修复它! – 2009-11-11 14:32:04

+0

尝试使用gridplitter在所有的子网格,看我的回答,希望这有助于 – punker76 2011-12-05 09:52:44

回答

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 2009-11-11 14:02:46

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> 

希望这有助于