2011-05-10 21 views
6

Gridsplitter bir ızgarayı yeniden boyutlandırmak için kullanıldığında, satır * diğer satırlar daraltıldığında alanı geri almayacaktır.Yeniden boyutlandırıldıktan sonra WPF GridSplitter

Aşağıdaki ızgarayı üç satırlı ana ayrıntı görünümünde kullanıyorum. Ortadaki bir splitter ve son sırada bir contentcontrol görünümü üzerinde bir veri ızgarası. Ayırıcı, ayrıntıları daraltmak için üzerinde kapat düğmesi vardır. Tüm bunlar, kullanıcı bir kez gridsplitter kullanarak yeniden boyutlandırıldığında istisna ile çalışır.

<Grid Margin="3,0"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Style="{StaticResource CollapsableRow}"/><!-- Splitter Here --> 
     <RowDefinition Style="{StaticResource CollapsableRow}"/> 
    </Grid.RowDefinitions> 

GridSplitter stili:

<Style x:Key="gridSplitterStyle" TargetType="{x:Type GridSplitter}"> 
    <Setter Property="Visibility" Value="{Binding IsItemSelected, Converter={StaticResource BoolToShow},ConverterParameter='Visible|Collapsed'}" /> 
    <Setter Property="Width" Value="Auto"/> 
    <Setter Property="Height" Value="14"/> 
    <Setter Property="HorizontalAlignment" Value="Stretch"/> 
    <Setter Property="Border.BorderBrush" Value="#FF6593CF" /> 
    <Setter Property="Border.BorderThickness" Value="0,1,0,0" /> 
    <Setter Property="UIElement.SnapsToDevicePixels" Value="True" /> 
    <Setter Property="UIElement.Focusable" Value="False" /> 
    <Setter Property="Control.Padding" Value="7,7,7,7" /> 
    <Setter Property="Cursor" Value="SizeNS" /></Style> 

Ben GridSplitter yeniden boyutlandırmak için kullanılmadığı sürece çöküşü düzgün çalıştığını söyledi gibi. Bundan sonra beyaz boşluk kalır.

EDIT: H.B. ve çok basit ve tutarlı öneriler vardı ve ben bir veri tetikleyici başarı w/o bunları uygulamaya teşebbüs codenaked: Eğer GridSplitter kullanırsanız

<Style x:Key="CollapsableRow" TargetType="{x:Type RowDefinition}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding SelectedItem, Converter={StaticResource IsNullConverter}}" Value="True"> 
      <Setter Property="RowDefinition.Height" Value="0"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding SelectedItem, Converter={StaticResource IsNullConverter}}" Value="False"> 
      <Setter Property="RowDefinition.Height" Value="Auto"/> 
     </DataTrigger>    
    </Style.Triggers> 
</Style> 

cevap

6

Şebeke ayırıcı ve detay zaten gizlendiğinden Görünürlük, sonraki satır tanımı yüksekliğini sıfırlamak için açık seçikti.

/// <summary> 
/// Grid splitter that show or hides the following row when the visibility of the splitter is changed. 
/// </summary> 
public class HidableGridSplitter : GridSplitter { 

    GridLength height; 

    public HidableGridSplitter() 
    { 
     this.IsVisibleChanged += HideableGridSplitter_IsVisibleChanged; 
     this.Initialized += HideableGridSplitter_Initialized; 
    } 

    void HideableGridSplitter_Initialized(object sender, EventArgs e) 
    { 
     //Cache the initial RowDefinition height, 
     //so it is not always assumed to be "Auto" 
     Grid parent = base.Parent as Grid; 
     if (parent == null) return; 
     int rowIndex = Grid.GetRow(this); 
     if (rowIndex + 1 >= parent.RowDefinitions.Count) return; 
     var lastRow = parent.RowDefinitions[rowIndex + 1]; 
     height = lastRow.Height; 
    } 

    void HideableGridSplitter_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     Grid parent = base.Parent as Grid; 
     if (parent == null) return; 

     int rowIndex = Grid.GetRow(this); 

     if (rowIndex + 1 >= parent.RowDefinitions.Count) return; 

     var lastRow = parent.RowDefinitions[rowIndex + 1]; 

     if (this.Visibility == Visibility.Visible) 
     { 
      lastRow.Height = height; 
     } 
     else 
     { 
      height = lastRow.Height; 
      lastRow.Height = new GridLength(0); 
     } 

    } 
1

Heights artık Auto ama somut değerlerdir. Değerleri elle bir stil veya olaylar ve arka plan kodu kullanarak manuel olarak değiştirmeniz gerekir. Bu çift tıklama üzerine otomatik boyut sütunu sıfırlar:

private void ColumnSplitter_DoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    if (!ColumnTreeView.Width.IsAuto) ColumnTreeView.Width = new GridLength(); 
} 
+0

Koddaki ızgara uzunluğunun ayarlanması yapılması gereken işlemdir. Ancak bu durumda çift tıklama çalışmaz. Izgara ayırıcı, stil haline getiriliyor ve aslında splitter üzerinde kapanış yapan bir düğme. Izgara ayırıcıyı geçersiz kılmayı seçiyorum ve parent.hiegth'i orada ayarlıyorum. –

+0

Kodum sadece bir örnekti, 'DoubleClick' üzerinde hiçbir şey yapmanıza asla beklemiyordum. –

0

Verdiğiniz dayanarak, GridSplitter önceki ve sonraki satırları yeniden boyutlandırmak olacaktır. Bu kod ile eylem bu görebilirsiniz:

<Grid Margin="3,0"> 
    <Grid.RowDefinitions> 
     <RowDefinition x:Name="row0" Height="*" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition x:Name="row2" Height="Auto" /> 
    </Grid.RowDefinitions> 
    <Border Background="Red" > 
     <TextBlock Text="{Binding ElementName=row0, Path=Height}" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
    </Border> 
    <GridSplitter Grid.Row="1" Style="{StaticResource gridSplitterStyle}" HorizontalAlignment="Stretch" /> 
    <Border Background="Blue" Grid.Row="2" MinHeight="50"> 
     <TextBlock Text="{Binding ElementName=row2, Path=Height}" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
    </Border> 
</Grid> 

geçen satırın boyutu aslında sabit bir yüksekliğe Auto değişecektir. Dolayısıyla, bu satırdaki içeriği daraltsanız bile, yine de belirtilen alanı kaplar. İçeriği ile gerçekten daraltmak için satırı Height="Auto"'a sıfırlamanız gerekir.

+0

Ben ve H.B'nizi seviyorum. s deşifre etmek ve satırda bir stil tetikleyici itiraz: –

+0

işe yaramadı :(rowDefinition ayarlanacak yeni bir GridLength örneğine gereksinim duyuyor –

+0

@Ryan - Anladığımdan emin değilim. .Height = GridLength.Auto; 'sonra sıfırlardı. – CodeNaked

İlgili konular