2011-12-17 15 views
11

Mi sono imbattuto in uno strano problema ...
Sembra che il ridimensionamento delle colonne di Grid usando un GridSplitter disabilita (o altrimenti disattiva) il trigger definito sulla colonna di una Grid.GridSplitter sovrascrive il trigger di stile di ColumnDefinition?

Ecco la mia messa a punto:

Una Griglia ha 3 colonne, definito come segue:

<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="*" /> 
    <ColumnDefinition> 
     <ColumnDefinition.Style> 
      <Style> 
       <Setter Property="ColumnDefinition.Width" Value="Auto"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=OpenItemViewModels.Count}" Value="0"> 
         <Setter Property="ColumnDefinition.Width" Value="0"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ColumnDefinition.Style> 
    </ColumnDefinition> 
    <ColumnDefinition> 
     <ColumnDefinition.Style> 
      <Style> 
       <Setter Property="ColumnDefinition.Width" Value="4*"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=OpenItemViewModels.Count}" Value="0"> 
         <Setter Property="ColumnDefinition.Width" Value="0"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ColumnDefinition.Style> 
    </ColumnDefinition> 
</Grid.ColumnDefinitions> 

L'aspettativa è che quando non ci sono elementi che ItemsSource costituiscono per il controllo nel terzo colonna , 0 larghezza verrà assegnata alla seconda e alla terza colonna (che ospitano rispettivamente il GridSplitter e il controllo delle voci ausiliarie).

Questo funziona bene fino a quando non tocchi lo Splitter (quando tutte le schede del controllo ausiliario sono chiuse, rimane visibile solo la prima colonna).
I problemi iniziano se sposto lo splitter, cambiando così efficacemente la proporzione tra le colonne ## 0 e 2. In tale scenario, la larghezza di queste colonne non viene ripristinata quando tutti gli elementi nel controllo a destra sono chiusi.

Ho il sospetto che questo abbia a che fare con il GridSplitter "superando" le mie definizioni in XAML.

Qualcuno può confermare/confutare questa teoria e suggerire come risolvere il problema?

risposta

0

Ho avuto lo stesso problema ...

L'unica cosa che ho potuto lavorare fuori era qualcosa di simile:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" x:Name="theColumn"/> 
     <ColumnDefinition Width="1*"/> 
    </Grid.ColumnDefinitions> 
    <Expander Grid.Column="0" x:Name="theExpander" Expander.Collapsed="theExpander_Collapsed"> 
     ... 
    </Expander> 
    <GridSplitter Grid.Column="0" HorizontalAlignment="Right" Width="5"> 
     <GridSplitter.Style> 
      <Style TargetType="{x:Type GridSplitter}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=theExpander, Path=IsExpanded}" Value="False"> 
         <Setter Property="Visibility" Value="Collapsed"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </GridSplitter.Style> 
    </GridSplitter> 
    <Grid Grid.Column="1"> 
     ...  
    </Grid> 
</Grid> 

E il codice dietro:

private void theExpander_Collapsed(object sender, RoutedEventArgs e) 
    { 
     theColumn.Width = GridLength.Auto; 
    } 

E ' non nel modo in cui preferirei farlo, ma provare a usare un trigger di stile sulla definizione della colonna non funziona.

17

Ho avuto lo stesso problema per rowdefinition. Gridsplitter sovrascriverà qualsiasi cosa diamo in stile o setter. Può essere risolto utilizzando l'animazione (poiché l'animazione ha la massima priorità nella risoluzione del valore della proprietà di dipendenza). Fai lo stesso per la terza colonna.

<Grid.ColumnDefinitions> 
<ColumnDefinition Width="*" /> 
<ColumnDefinition> 
    <ColumnDefinition.Style> 
     <Style> 
      <Setter Property="ColumnDefinition.Width" Value="Auto" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=OpenItemViewModels.Count}" Value="0"> 
        <DataTrigger.EnterActions> 
         <BeginStoryboard Name="BeginStoryboard1"> 
          <Storyboard> 
           <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Width"> 
            <ObjectAnimationUsingKeyFrames.KeyFrames> 
             <DiscreteObjectKeyFrame KeyTime="0:0:0" 
                   Value="{x:Static GridLength.Auto}" /> 
            </ObjectAnimationUsingKeyFrames.KeyFrames> 
           </ObjectAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
        <DataTrigger.ExitActions> 
         <RemoveStoryboard BeginStoryboardName="BeginStoryboard1" /> 
        </DataTrigger.ExitActions> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ColumnDefinition.Style> 
</ColumnDefinition> 

+0

soluzione stupefacente. Ho faticato 2 giorni per risolvere una cosa simile, e con questa soluzione mi ci è voluta un'ora per adattare il mio xaml, solo con le Rows. Grazie mille! – XMight

+0

@Alex Che ne dici di accettare questo come una risposta? – Andre

1

mi si avvicinò con una classe di supporto che aiuta a risolvere il problema delle colonne/righe che vengono anche ridimensionate con GridSplitter pieghevoli.

public class CollapsibleRowDefinition : RowDefinition 
{ 
    public static readonly DependencyProperty IsCollapsedProperty = DependencyProperty.Register(
     "IsCollapsed", 
     typeof(bool), 
     typeof(CollapsibleRowDefinition), 
     new FrameworkPropertyMetadata(
      false, 
      (s,e) => { ((CollapsibleRowDefinition) s).IsCollapsed = (bool)e.NewValue; })); 

    private bool isCollapsed = false; 

    public CollapsibleRowDefinition() 
    { 
     DependencyPropertyDescriptor.FromProperty(RowDefinition.HeightProperty, typeof(RowDefinition)).AddValueChanged(this, 
      (sender, args) => 
      { 
       if (!this.IsCollapsed) 
       { 
        this.ExpandedHeight = this.Height; 
       } 
      }); 
    } 

    public GridLength CollapsedHeight { get; set; } 
    public GridLength ExpandedHeight { get; set; } 

    public bool IsCollapsed 
    { 
     get { return this.isCollapsed; } 
     set 
     { 
      if (this.isCollapsed != value) 
      { 
       this.isCollapsed = value; 
       this.Height = value ? this.CollapsedHeight : this.ExpandedHeight; 
      } 
     } 
    } 
} 

marcatura passa poi come questo

 <Grid.RowDefinitions> 
      <RowDefinition Height="40"/> 
      <RowDefinition Height="2*"/> 
      <RowDefinition Height="5"/> 
      <c:CollapsibleRowDefinition CollapsedHeight="20" ExpandedHeight="*" IsCollapsed="{Binding ElementName=Btn_BottomCollapse, Path=IsChecked}"/> 
     </Grid.RowDefinitions> 
     <GridSplitter Grid.Row="2" HorizontalAlignment="Stretch" 
         IsEnabled="{Binding ElementName=Btn_BottomCollapse, Path=IsChecked}"/> 
Problemi correlati