Неверный размер сетки данных

#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