2017-02-17 1 views
1

Ich habe ein DataGrid, das in einem einer Reihe von Expandern in einem größenveränderbaren Fenster ist. Wenn die DataGrid-Zeilen geladen werden, erstreckt sich das DataGrid ohne Scrollbalken vom unteren Rand des Fensters.Wie werden die Bildlaufleisten eines DataGrids angezeigt, wenn sie sich in einem Expander befinden?

Ich habe das Problem auf die einfachsten Elemente reduziert Ich konnte unter

Ich habe versucht, das Datagrid in einem separaten Scroll setzen, aber das gleiche Problem hatte.

Ich brauche auch die anderen beiden Expander im Fenster sichtbar zu bleiben und nicht von der Kante geschoben werden. Ich hatte ein wenig Erfolg, als ich die drei Expander in ein DockPanel steckte, aber das DataGrid wurde immer noch erweitert, um das gesamte Fenster auszufüllen, sodass die anderen Expanders nicht mehr sichtbar waren.

XAML

<Window x:Class="WPFTestApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WPFTestApp" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid Name="root"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Expander Grid.Row="0" Name="Expander1" Expanded="Expander_Expanded"> 
      <Expander.Header>Expander</Expander.Header> 
      <Expander.Content> 
       <ScrollViewer> 
       <DataGrid Grid.Row="1" Name="dataGrid"> 
        <DataGrid.Columns> 
         <DataGridTextColumn Header="A" Binding="{Binding A}" /> 
         <DataGridTextColumn Header="B" Binding="{Binding B}" /> 
         <DataGridTextColumn Header="C" Binding="{Binding C}" /> 
         <DataGridTextColumn Header="D" Binding="{Binding D}" /> 
        </DataGrid.Columns> 
       </DataGrid> 
       </ScrollViewer> 

      </Expander.Content> 
     </Expander> 
     <Expander Grid.Row="1" Name="Expander2" Expanded="Expander_Expanded"> 
      <Expander.Content> 
       <TextBlock>...<LineBreak/>...<LineBreak/>...<LineBreak/>...<LineBreak/>...<LineBreak/>...</TextBlock> 
      </Expander.Content> 
     </Expander> 
     <Expander Grid.Row="2" Name="Expander3" Expanded="Expander_Expanded"> 
      <Expander.Content> 
       <TextBlock>...<LineBreak/>...<LineBreak/>...<LineBreak/>...<LineBreak/>...<LineBreak/>...</TextBlock> 
      </Expander.Content> 
     </Expander> 
    </Grid> 
</Window> 

Codebehind

using System; 
using System.Windows; 

namespace WPFTestApp { 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 

    public class Data { 
     public Guid A { get; set; } 
     public Guid B { get; set; } 
     public Guid C { get; set; } 
     public Guid D { get; set; } 

     public Data() { 
      A = Guid.NewGuid(); 
      B = Guid.NewGuid(); 
      C = Guid.NewGuid(); 
      D = Guid.NewGuid(); 
     } 
    } 


    public partial class MainWindow : Window { 
     public MainWindow() { 
      InitializeComponent(); 

      for (int x = 0; x < 20; x++) { 
       dataGrid.Items.Add(new Data()); 
      } 

     } 

     private void Expander_Expanded(object sender, RoutedEventArgs e) { 
      if (Expander1 != sender) 
       Expander1.IsExpanded = false; 

      if (Expander2 != sender) 
       Expander2.IsExpanded = false; 

      if (Expander3 != sender) 
       Expander3.IsExpanded = false; 
     } 
    } 
} 

Antwort

1

entfernen ScrollViewer Element um die DataGrid und gibt eine Höhe (entweder eine feste Größe oder einen star-sized eins) für die RowDefinitions:

<Grid Name="root"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="1*" /> 
     <RowDefinition Height="1*" /> 
     <RowDefinition Height="1*" /> 
    </Grid.RowDefinitions> 
    <Expander Grid.Row="0" Name="Expander1" Expanded="Expander_Expanded"> 
     <Expander.Header>Expander</Expander.Header> 
     <Expander.Content> 
      <DataGrid Grid.Row="1" Name="dataGrid"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="A" Binding="{Binding A}" /> 
        <DataGridTextColumn Header="B" Binding="{Binding B}" /> 
        <DataGridTextColumn Header="C" Binding="{Binding C}" /> 
        <DataGridTextColumn Header="D" Binding="{Binding D}" /> 
       </DataGrid.Columns> 
      </DataGrid> 
     </Expander.Content> 
    </Expander> 
    <Expander Grid.Row="1" Name="Expander2" Expanded="Expander_Expanded"> 
     <Expander.Content> 
      <TextBlock>...<LineBreak/>...<LineBreak/>...<LineBreak/>...<LineBreak/>...<LineBreak/>...</TextBlock> 
     </Expander.Content> 
    </Expander> 
    <Expander Grid.Row="2" Name="Expander3" Expanded="Expander_Expanded"> 
     <Expander.Content> 
      <TextBlock>...<LineBreak/>...<LineBreak/>...<LineBreak/>...<LineBreak/>...<LineBreak/>...</TextBlock> 
     </Expander.Content> 
    </Expander> 
</Grid> 

Sie erhalten keine ny vertikale Bildlaufleisten, wenn die Height auf Auto eingestellt ist, weil dann die Expander als eine unendliche Höhe betrachtet wird.

+0

, die in der alle drei Expanders die gleiche Menge an vertikalen Raum gibt Raster, egal ob sie erweitert sind oder nicht. Ich spielte mit den RowDefinition-Höhen herum und erkannte, dass ich die Höhen zwischen Auto und 1 * in der Expander_Expanded-Funktion ändern konnte und es gab mir genau das, was ich wollte. – Hypersapien

+0

Sie können die Höhe auf das einstellen, was Sie wollen, aber Auto - entweder in der XAML-Markierung oder programmgesteuert. 1 * war nur ein Beispiel. – mm8

+0

Ich sage nur, dass die Höhen der RowDefinitions unterschiedlich eingestellt werden müssen, abhängig davon, ob der Expander erweitert ist oder nicht. Ich habe meine Lösung hier gepostet. – Hypersapien

0

Ändern der RowDefinitions zu

<Grid.RowDefinitions> 
    <RowDefinition Name="gridRowEx1" Height="Auto" /> 
    <RowDefinition Name="gridRowEx2" Height="Auto" /> 
    <RowDefinition Name="gridRowEx3" Height="Auto" /> 
</Grid.RowDefinitions> 

und Ändern der Expander_Expanded Funktion

private void Expander_Expanded(object sender, RoutedEventArgs e) { 
     switch (((Expander)sender).Name) { 
      case "Expander1": 
       Expander2.IsExpanded = false; 
       Expander3.IsExpanded = false; 
       gridRowEx1.Height = new GridLength(1.0, GridUnitType.Star); 
       gridRowEx2.Height = new GridLength(1.0, GridUnitType.Auto); 
       gridRowEx3.Height = new GridLength(1.0, GridUnitType.Auto); 
       break; 
      case "Expander2": 
       Expander1.IsExpanded = false; 
       Expander3.IsExpanded = false; 
       gridRowEx1.Height = new GridLength(1.0, GridUnitType.Auto); 
       gridRowEx2.Height = new GridLength(1.0, GridUnitType.Star); 
       gridRowEx3.Height = new GridLength(1.0, GridUnitType.Auto); 

       break; 
      case "Expander3": 
       Expander1.IsExpanded = false; 
       Expander2.IsExpanded = false; 
       gridRowEx1.Height = new GridLength(1.0, GridUnitType.Auto); 
       gridRowEx2.Height = new GridLength(1.0, GridUnitType.Auto); 
       gridRowEx3.Height = new GridLength(1.0, GridUnitType.Star); 
       break; 
     } 
    } 

gibt mir genau das, was ich brauchte

+0

Wie wäre es, den ScrollViewer wie vorgeschlagen zu entfernen? Und ich denke, ich habe auch vorgeschlagen, dass Sie die Höhe der RowDefinitions nicht auf Auto setzen sollten, aber ich weiß nicht ... natürlich können Sie dies programmatisch im Expanded Event-Handler tun, wenn Sie wollen, aber das ist nicht wirklich wichtig soweit es darum geht, keine Scrollbalken zu sehen. – mm8

+0

Ja. Ehrlich gesagt, hatte ich vergessen, dass der ScrollViewer immer noch da war, als ich ihn gepostet habe. Es sollte eigentlich gar nicht dort sein. Ich könnte wahrscheinlich die Höhe der RowDefinitions mit dem IsExpanded-Status des Expanders verbinden, aber ich bin mir nicht sicher, ob ich das Problem durchgehen möchte. – Hypersapien

+0

Der Punkt ist immer noch, dass der Schlüssel, um die Bildlaufleisten wie erwartet zu arbeiten, ist, die Höhe der Zeilen auf etwas anderes als Auto zu setzen. – mm8

Verwandte Themen