#wpf #datagrid
#wpf #сетка данных
Вопрос:
Как вы можете видеть, в моем приложении есть две сетки данных. По неизвестным причинам одна или обе сетки не будут иметь правильного размера при запуске приложения. (Изображения загружаются программно.)
Кто-нибудь знает, почему и, что более важно, способ исправить эту проблему?
Странная вещь, которую следует отметить, заключается в том, что сетка изменяет свои размеры при наведении на нее кнопки прокрутки мыши, но кнопка прокрутки не прокручивает сетку (прокручивают только страницу вверх / вниз и клавиши курсора, за исключением, конечно, перетаскивания полосы прокрутки). Кроме того, даже если ScrollViewer
удалить, проблема сохраняется.
XAML
<UserControl x:Class="SW.ImagesControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:SW="clr-namespace:SW">
<UserControl.Resources>
<SW:NullImageConverter x:Key="NullImageConverter" />
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ScrollViewer HorizontalScrollBarVisibility="Visible" Grid.Row="1" Grid.ColumnSpan="2">
<DataGrid AutoGenerateColumns="False" IsReadOnly="True" Padding="0" Margin="0"
ItemsSource="{Binding}" SelectionUnit="Cell"
VirtualizingStackPanel.VirtualizationMode="Recycling" >
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTemplateColumn Header="Image">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Command="{Binding ChangeImageCommand}">
<Button.Template>
<ControlTemplate>
<Grid>
<TextBlock Name="tb" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed">
<Hyperlink Command="{Binding ChangeImageCommand}">Browse...</Hyperlink>
</TextBlock>
<Image Name="img" Source="{Binding Image, Converter={StaticResource NullImageConverter}}" Margin="0"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger SourceName="img" Property="Source" Value="{x:Null}">
<Setter TargetName="tb" Property="Visibility" Value="Visible"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Preview">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding PreviewImage, Converter={StaticResource NullImageConverter}}" Margin="0" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</ScrollViewer>
</Grid>
</UserControl
Ответ №1:
У DataGrid
нее есть внутренняя ScrollViewer
, поэтому внешняя не нужна. Возможно, это было не очевидно, поскольку VirtualizingStackPanel.VirtualizationMode
было установлено значение Recycling
. Удаление этого атрибута и средства просмотра прокрутки решает проблему с размером, а также отсутствие прокрутки.
<UserControl x:Class="SW.ImagesControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:SW="clr-namespace:SW">
<UserControl.Resources>
<SW:NullImageConverter x:Key="NullImageConverter" />
</UserControl.Resources>
<DataGrid AutoGenerateColumns="False" IsReadOnly="True" Padding="0" Margin="0"
ItemsSource="{Binding}" SelectionUnit="Cell" >
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTemplateColumn Header="Image">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Command="{Binding ChangeImageCommand}">
<Button.Template>
<ControlTemplate>
<Grid>
<TextBlock Name="tb" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed">
<Hyperlink Command="{Binding ChangeImageCommand}">Browse...</Hyperlink>
</TextBlock>
<Image Name="img" Source="{Binding Image, Converter={StaticResource NullImageConverter}}" Margin="0"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger SourceName="img" Property="Source" Value="{x:Null}">
<Setter TargetName="tb" Property="Visibility" Value="Visible"/>
<!--<Setter TargetName="img" Property="Visibility" Value="Collapsed"/>-->
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Preview">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding PreviewImage, Converter={StaticResource NullImageConverter}}" Margin="0" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</UserControl