2009-11-11 4 views
6

Desidero utilizzare una griglia per il mio layout di livello superiore. La griglia avrà 1 colonna e n righe. Ogni riga della griglia deve contenere anche una griglia che deve contenere 3 colonne e 1 riga. Nella seconda colonna c'è un GridSplitter e sto cercando di usare un SharedSizeGroup in modo che questo cambi la dimensione della prima colonna su tutte le Griglie annidate.WPF SharedSizeGroup GridSplitter Edizione

Ecco cosa ho ... e funziona !! ... beh tipo di ... se si fa clic sullo splitter e si ridimensiona senza lasciarlo funzionare funziona ... ma per qualche motivo se si ridimensiona qualcosa e lascia andare il mouse e poi tenta di ridimensionare usando una riga diversa che sembra "attaccare".

Qualche 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

Ho anche provato questo in VS2010 beta 2 con .net 4.0 e ottenere lo stesso problema. – pmcilreavy

+0

Se questo è il caso, è necessario segnalare immediatamente questo bug su Microsoft Connect. C'è ancora una possibilità che possano risolverlo in 4.0 !!! –

+0

prova ad usare un gridplitter su tutte le tue subgrid, guarda la mia risposta, spero che questo aiuti – punker76

risposta

9

rinnovo di mia risposta da ms connect:.

Di solito è possibile aggirare il non usando SharedSizeGroup e invece vincolanti tutte le dimensioni condivise a sola proprietà su un oggetto (ad esempio il 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> 

Dove Larghezza0 e Larghezza1 sono di tipo corrispondente (GridLength). Funziona con qualsiasi tipo di dimensionamento (fisso, stella e auto) in qualsiasi combinazione.

UPDATE:

alternativa e forse meglio, invece di legarsi a DataContext, lo si può fare esclusivamente in XAML. Basta definire una singola griglia principale (non necessariamente un genitore ma hai bisogno di un modo per fare riferimento a essa) con le colonne nominate, quindi associare loro per nome.

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

Questo ha aggiunto il vantaggio dell'utilizzo di uno splitter a singola griglia condiviso da tutte le griglie.

2

Sono in grado di riprodurlo e, onestamente, sembra un bug. Per essere precisi, se si espande la larghezza della colonna nella riga uno, non riesco a ridurre la larghezza oltre quella larghezza di un'altra riga. Ho intenzione di provare a giocare con questo ancora un po ', ma ... non sono sicuro di cosa aggiustarlo.

+0

Grazie per la risposta. Questo è quello che stavo pensando. Sembra * come dovrebbe funzionare, e kinda fa ... ma anche totalmente no. Mi sta facendo impazzire !! – pmcilreavy

1

prova questa soluzione se è ok per te (a Kaxaml funziona bene).

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

Spero che questo aiuti