#wpf #xaml #datagrid
#wpf #xaml #datagrid
Вопрос:
Всем привет. У меня проблема с datagrid в моем окне. Я хочу, чтобы он расширялся только до необходимого размера, если он не заполняет все окно или не показывает полосу прокрутки, если она занимает весь экран. Вот мой xaml
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<DataGrid Grid.Row="0" Name="dg">
<DataGrid.Columns>
<DataGridTextColumn Header="Col1"/>
<DataGridTextColumn Header="Col1"/>
</DataGrid.Columns>
</DataGrid>
<GroupBox Grid.Row="2" Margin="5">
<Button>Click</Button>
</GroupBox>
</Grid>
Если я установлю высоту строки для datagrid равной *, это расширит серый фон datagrid на всю строку. Но если я установлю высоту на auto, тогда не будет отображаться полоса прокрутки, когда в окне слишком много элементов.
Есть идеи?
Ответ №1:
Вы пробовали вложить DataGrid в ScrollViewer?
Комментарии:
1. Да, это тоже не дает желаемого результата. Он по-прежнему будет расширяться за пределы экрана с помощью RowHeight = auto и ведет себя очень похоже на просто datagrid, если RowHeight =*
2. После еще нескольких попыток, если я вложил сетку данных внутрь scrollviewer и stackpanel, я получил желаемые результаты. Можете ли вы указать это в своем ответе для других?
3. Основываясь на том, что я опубликовал ниже, я даже не уверен, что вам вообще нужен scrollviewer.
Ответ №2:
Я думаю, что проблема может быть в другом месте. Я попробовал ваш код локально и создал некоторые данные. Смотрите ниже:
<UserControl x:Class="ControlSandbox.StackOverflowQuestion"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid x:Name="Root">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<DataGrid Grid.Row="0" Name="dg" ItemsSource="{Binding Data}">
<DataGrid.Columns>
<DataGridTextColumn Header="Col1" Binding="{Binding Item1}" />
<DataGridTextColumn Header="Col1" Binding="{Binding Item2}"/>
</DataGrid.Columns>
</DataGrid>
<GroupBox Grid.Row="2" Margin="5">
<Button>Click</Button>
</GroupBox>
</Grid>
Я создал некоторые данные следующим образом:
public partial class StackOverflowQuestion : UserControl
{
public StackOverflowQuestion()
{
Data = new ObservableCollection<Tuple<string, string>>();
Data.Add(new Tuple<string, string>("test", "test"));
Data.Add(new Tuple<string, string>("test", "test"));
Data.Add(new Tuple<string, string>("test", "test"));
Data.Add(new Tuple<string, string>("test", "test"));
Data.Add(new Tuple<string, string>("test", "test"));
Data.Add(new Tuple<string, string>("test", "test"));
Data.Add(new Tuple<string, string>("test", "test"));
Data.Add(new Tuple<string, string>("test", "test"));
Data.Add(new Tuple<string, string>("test", "test"));
Data.Add(new Tuple<string, string>("test", "test"));
Data.Add(new Tuple<string, string>("test", "test"));
Data.Add(new Tuple<string, string>("test", "test"));
InitializeComponent();
Root.DataContext = this;
}
public ObservableCollection<Tuple<String, String>> Data {
get;
set;
}
}
Результатом является правильно отредактированный элемент управления с полосой прокрутки:
И в другом направлении:
Если я не совсем неправильно понимаю ваш вопрос?
ОБНОВЛЕНИЕ: Добавлен снимок всего экрана:
Комментарии:
1. Попробуйте, чтобы элементов было недостаточно для заполнения экрана, и скажите мне, видите ли вы фон datagrid или окна.
2. Обновлено с помощью полноэкранного снимка.
3. Да, это та же проблема, с которой я столкнулся. Серый фон сетки данных закрывал фон окна, которое я хотел видеть, до тех пор, пока в сетке данных не будет достаточно элементов, чтобы фактически заполнить экран. Я бы установил фон dg прозрачным, но у наших datagrids есть тень по границе. Это создало случайную тень, окружающую невидимый фон