0

我有一个列表框,我想在其中设置列取决于上下文(图像大小)。所以如果我有更大的图像,那么我想要更少的列。如果未设置列属性,则可以正常工作,但是如果我的图像非常宽,则拉伸太大。如果我设置图像的 minWidth 或 minHeight,由于图像尺寸不同(宽图像中添加了许多空白),并不总是可以正常工作。所以我的下一个想法是以编程方式设置列数以取决于图像大小。也许有绑定,但我不知道如何将其应用于代码。

<ListBox SelectionMode="Multiple" Grid.Column="0" x:Name="lvBox" ScrollViewer.HorizontalScrollBarVisibility="Disabled" VerticalAlignment="Top">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <UniformGrid Columns="2" HorizontalAlignment="Stretch"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ListBox.ItemContainerStyle>
                    <Style TargetType="{x:Type ListBoxItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="ListBoxItem">
                                    <Border Name="Border" Padding="2" SnapsToDevicePixels="true" Background="White" Margin="0">
                                        <ContentPresenter/>
                                    </Border>
                                    <ControlTemplate.Triggers>
                                        <Trigger Property="IsSelected" Value="true">
                                            <Setter TargetName="Border" Property="Background" Value="LightBlue"/>
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListBox.ItemContainerStyle>
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch">
                            <Image Name="imageView" Source="{Binding ImageData}" HorizontalAlignment="Stretch" VerticalAlignment="Top" Stretch="UniformToFill" />
                            <TextBlock Text="{Binding TimeStamp}" HorizontalAlignment="Stretch" VerticalAlignment="Bottom"/>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

这是一个问题,其中未设置 uniformgrid 中的列属性并且图像很宽。图像太小(列太多)。

宽幅图像

这里是普通图片的问题,列直接设置为2。图片太大(没有足够的列)。

在此处输入图像描述

知道如何解决这个问题吗?如何在没有硬编码设置 minWidth 或 minHeight 的情况下限制拉伸,或者如何在 C# 中设置列​​数取决于图像大小。

4

1 回答 1

1

我找到了一个适合我的解决方案。我ItemsPanelTemplate像这样添加绑定:

<ItemsPanelTemplate>
  <UniformGrid Columns="{Binding Path=Cols}" HorizontalAlignment="Stretch"/>
</ItemsPanelTemplate>

我使用Property Change Notification。添加INotifyPropertyChanged到类,这是其余的代码:

private int _cols = 1;
public bool Cols
{
  get => _cols;
}

public event PropertyChangedEventHandler PropertyChanged;
void RaisePropertyChanged(string propertyName)
{
  PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

RaisePropertyChanged(nameof(Cols));

当我计算列数时,我设置 _cols 然后调用RaisePropertyChanged(nameof(Cols));

于 2020-04-04T21:51:25.157 回答