2009-02-17 24 views
6

Właśnie zaczynam od Silverlighta używając wersji 2.0. Chciałem pokazać kilka siatek danych na stronie i udało mi się to osiągnąć, upuszczając każdą z nich do komórki siatki. I wtedy pomyślałem, że warto dodać rozdzielacz siatki za pomocą następującego znaczników:Silverlight Grid Splitter Nieoczekiwane zachowanie

<UserControl xmlns:basics="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="SilverlightApplication1.Page" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Loaded="UserControl_Loaded"> 
    <Grid x:Name="LayoutRoot" Background="White"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition></ColumnDefinition> 
      <ColumnDefinition Width="Auto"></ColumnDefinition> 
      <ColumnDefinition></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition></RowDefinition> 
      <RowDefinition></RowDefinition> 
     </Grid.RowDefinitions> 
     <basics:GridSplitter Grid.RowSpan="2" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Left" Width="5" VerticalAlignment="Stretch" ></basics:GridSplitter> 
     <data:DataGrid Name="TLGrid" Grid.Row="0" Grid.Column="0"> 
     </data:DataGrid> 
     <data:DataGrid Name="TRGrid" Grid.Row="0" Grid.Column="2"> 
     </data:DataGrid> 
     <data:DataGrid Name="BLGrid" Grid.Row="1" Grid.Column="0"> 
     </data:DataGrid> 
     <data:DataGrid Name="BRGrid" Grid.Row="1" Grid.Column="2"> 
     </data:DataGrid> 
    </Grid> 
</UserControl> 

Spodziewałem się, aby móc przeciągnąć, aby zmienić rozmiar splitter wokół dwóch pozostałych kolumn. Kiedy przeciągam pasek, obie pozostałe kolumny kurczą się. Czy ktoś może wyjaśnić, dlaczego?

Odpowiedz

7

Nie potrzebujesz środkowej kolumny do rozrzutu siatki. Rozgałęźnik będzie wiązał się z prawą krawędzią kolumny 0, jeśli umieścisz spliter w kolumnie 0. Możesz dodać mały margines do siatki po lewej stronie, aby nie stracić ostatnich 5 pikseli.

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="1*"/> 
     <!--<ColumnDefinition Width="Auto"/>--> 
     <ColumnDefinition Width="1*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="1*"/> 
     <RowDefinition Height="1*"/> 
    </Grid.RowDefinitions> 

    <data:DataGrid Name="TLGrid" Grid.Row="0" Grid.Column="0" /> 
    <data:DataGrid Name="BLGrid" Grid.Row="1" Grid.Column="0"/> 

    <!-- Moved the grid splitter to column 0 --> 
    <basics:GridSplitter Grid.RowSpan="2" Grid.Row="0" Grid.Column="0" Width="5" /> 

    <data:DataGrid Name="TRGrid" Grid.Row="0" Grid.Column="2" /> 
    <data:DataGrid Name="BRGrid" Grid.Row="1" Grid.Column="2" />   
</Grid> 
+0

Dzięki, że działa idealnie. –

8

Powodem zmiany rozmiaru komórki w sposób masz doświadczonego jest w dół do wartości ColumnDefinition i HorizontalAlignment na GridSplitter. Ponieważ nie określono wysokości, szerokość kolumn jest domyślnie ustawiona na Gwiazdę. Oznacza to, że mają równy odstęp. Następnie określa, w którym kierunku zmienia rozmiar. Jeśli ją wyśrodkujesz lub rozciągniesz, to zmienisz rozmiar obu boków, ale jeśli dopasujesz ją do jednej krawędzi lub drugiej, zmieni ona tylko tę krawędź, ale ponieważ komórki dzielą przestrzeń równo, obie strony kurczą się zamiast jednego.

Mimo że zaakceptowana odpowiedź zapewnia alternatywne podejście, aby to zadziałało, w rzeczywistości nie wyjaśnia przyczyny problemu. Całkowicie dopuszczalne jest umieszczanie splittera we własnych komórkach - w rzeczywistości często jest to zalecane.

+0

Dzięki za wyjaśnienie. To też rozwiązało mój problem. – beaudetious

+0

@beudetious: Cieszę się, że mogłem pomóc. :) –

Powiązane problemy