2017-02-17 4 views
1

У меня есть DataGrid, который находится в одной из серии Expanders в изменяемом по размеру окне. Когда строки DataGrid загружаются, DataGrid распространяется в нижней части окна без каких-либо полос прокрутки.Как получить полосы прокрутки DataGrid для отображения, когда они находятся в расширителе?

Я уменьшил вопрос к простейшим элементам я мог бы ниже

Я пытался поставить DataGrid в отдельном ScrollViewer, но была такая же проблема.

Мне также нужны два других экспандера, чтобы они оставались видимыми в окне и не были сдвинуты с края. У меня был небольшой успех, поставив три Expanders в DockPanel, но DataGrid все еще расширился, чтобы заполнить все окно, нажав другие Expanders вне поля зрения.

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

ответ

1

Удалите ScrollViewer элемент вокруг DataGrid и указать высоту (либо фиксированный размер или ее star-sized один) для 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> 

Вы не получите ny вертикальные полосы прокрутки, когда Height установлено на Auto, потому что тогда Expander считается бесконечной.

+0

Это дает все три Расширители одинаковое количество вертикального пространства в сетка, независимо от того, расширены они или нет. Я играл с высотами RowDefinition и понял, что могу изменить высоту между авто и 1 * в функции Expander_Expanded, и он дал мне именно то, что я хотел. – Hypersapien

+0

Вы можете установить высоту как угодно, но автоматически - либо в разметке XAML, либо программно. 1 * был всего лишь примером. – mm8

+0

Я просто говорю, что высоты RowDefinitions нужно устанавливать по-разному в зависимости от расширения Expander или нет. Я разместил здесь свое решение. – Hypersapien

0

Изменение RowDefinitions к

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

И изменения функции Expander_Expanded в

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

дает мне именно то, что мне нужно было

+0

Как насчет удаления ScrollViewer, как я предложил? И я думаю, что я также предположил, что вы не должны устанавливать значение Height of RowDefinitions в Auto, но я не знаю ... конечно, вы можете сделать это программно в обработчике Expanded, если хотите, но это не имеет большого значения насколько вы не видите никаких полос прокрутки. – mm8

+0

Да. Честно говоря, я забыл, что ScrollViewer все еще был там, когда я его разместил. Во-первых, это не должно было быть. Я мог бы связать высоту RowDefinitions с состоянием IsExpanded Expander, но я не уверен, что хочу решить проблему. – Hypersapien

+0

Дело в том, что ключ, чтобы заставить полосы прокрутки работать как ожидалось, - установить высоту строк на что-то еще, кроме Auto. – mm8

Смежные вопросы