2011-12-17 11 views
11

Wpadłem na dziwny problem ...
Wygląda na to, że zmiana rozmiaru kolumn Grida za pomocą GridSplittera wyłącza (lub w inny sposób dezaktywuje) wyzwalacz zdefiniowany w kolumnie siatki.GridSplitter nadpisuje wyzwalacz stylu ColumnDefinition?

Oto moja konfiguracja:

siatka ma 3 kolumny, zdefiniowane następująco:

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

Oczekuje się, że gdy nie ma żadnych przedmiotów, które stanowią ItemsSource do kontroli w trzeciej kolumnie , 0 szerokość zostanie przypisana do drugiej i trzeciej kolumny (obsługujących odpowiednio kontroler GridSplitter i elementy pomocnicze).

Działa to dobrze, o ile nie dotknę Splittera (gdy wszystkie klawisze pomocniczego sterowania są zamknięte, widoczna jest tylko pierwsza kolumna).
Problemy zaczynają się, jeśli przesuję rozdzielacz, w ten sposób skutecznie zmieniając proporcje między kolumnami ## 0 i 2. W takim scenariuszu szerokość kolumn nie jest resetowana, gdy wszystkie elementy w sterowaniu z prawej strony są zamknięte.

Podejrzewam, że ma to coś wspólnego z tym, że GridSplitter "unieważnia" moje definicje w XAML.

Czy ktoś może potwierdzić/obalić tę teorię i zasugerować, jak rozwiązać problem?

Odpowiedz

0

miałem ten sam problem ...

Jedyne co udało mi się wypracować było coś takiego:

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

i kodeksem tyle:

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

Nadszedł nie w taki sposób, w jaki wolałbym to zrobić, ale próba użycia wyzwalacza stylu w definicji kolumny po prostu nie działa.

17

Miałem ten sam problem z definicją wiersza. Gridsplitter zastąpi wszystko, co damy w stylu lub seterów. Można go rozwiązać za pomocą animacji (ponieważ animacja ma najwyższy priorytet w rozdzielczości wartości właściwości zależności). Zrób to samo dla trzeciej kolumny.

<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

Niesamowity rozwiązania. Miałem 2 dni na rozwiązanie podobnej sytuacji i użycie tego rozwiązania zajęło mi godzinę, aby dostosować mój xaml, tylko z Rows. Dziękuję Ci bardzo! – XMight

+0

@Alex Co powiesz na zaakceptowanie tego jako odpowiedzi? – Andre

1

wymyśliłem klasy pomocnika, który pomaga rozwiązać problem składanych kolumn/wierszy, które są również zmieniany z GridSplitter.

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

znaczników następnie idzie tak

 <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}"/> 
Powiązane problemy