2009-11-11 17 views
6

Deseo utilizar una cuadrícula para mi diseño de nivel superior. The Grid tendrá 1 columna yn filas. Cada fila en la Grilla también debe contener una Grilla que tendrá 3 columnas y 1 fila. En la segunda columna hay un GridSplitter y estoy tratando de usar un SharedSizeGroup para que esto cambie el tamaño de la primera columna en todas las Grid anidadas.WPF SharedSizeGroup GridSplitter Issue

Esto es lo que tengo ... ¡¡y funciona !! ... bueno, tipo de ... si hace clic en el divisor y cambia el tamaño sin soltarlo funciona ... pero por alguna razón si cambia el tamaño de algo y suelte el mouse y luego intente redimensionar usando una fila diferente que parece "pegarse".

¿Alguna idea?

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

También han intentado esto en VS2010 beta 2 con .net 4.0 y obtienen el mismo problema. – pmcilreavy

+0

Si ese es el caso, debe informar este error en Microsoft Connect inmediatamente. ¡Todavía hay una posibilidad de que puedan arreglarlo en 4.0! –

+0

intente utilizar un divisor de cuadrículas en todas sus subredes, mire mi respuesta, espero que esto ayude – punker76

Respuesta

9

Traspaso de mi respuesta de ms connect:.

lo general, puede evitar este al no utilizar SharedSizeGroup y en lugar de todos los tamaños comunes a una sola propiedad de unión en un objeto (por ejemplo, su 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> 

Donde Width0 y Width1 son del tipo coincidente (GridLength). Funciona con cualquier tipo de tamaño (fijo, en estrella y automático) en cualquier combinación.

ACTUALIZACIÓN:

alternativa y tal vez mejor, en lugar de unirse a DataContext, puede hacerlo únicamente en XAML. Simplemente defina una sola grilla maestra (no necesariamente una matriz sino que necesita alguna forma de referenciarla) con columnas con nombre y luego vincule a ellas por su nombre.

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

Esto tiene la ventaja de utilizar un solo divisor de cuadrícula compartido por todas las cuadrículas.

2

Puedo reproducir esto y, sinceramente, parece un error. Para ser específico, si amplío el ancho de la columna en la fila uno, no puedo reducir el ancho más que el ancho de otra fila. Trataré de jugar con este más, pero ... no estoy seguro de qué arreglaría eso.

+0

Gracias por responder. Eso es lo que estaba pensando. * Parece * como que debería funcionar, y algo así ... pero también no. ¡Me está volviendo loco! – pmcilreavy

1

prueba esta solución si está bien para ti (en Kaxaml funciona bien).

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

Esperanza esto ayuda