【问题标题】:WPF image initial size before load加载前的 WPF 图像初始大小
【发布时间】:2014-05-16 18:44:12
【问题描述】:

我发现我在列表中加载的图像有一个奇怪的行为。以下是产生此问题的 itemTemplate 的简化 sn-p:

<Grid>
   <Grid.RowDefinitions>
      <RowDefinition Height="Auto" />
   </Grid.RowDefinitions>
   <Grid.ColumnDefinitions>
      <ColumnDefinition Width="180"/>
   </Grid.ColumnDefinitions>

<Image x:Name="Art" Grid.Row="1" Grid.Column="1" Source="{Binding Url}" Stretch="UniformToFill" />
</Grid>

图像加载的文件是大小为 360w,240h 的 .png。当我第一次打开加载上述 xaml 的页面时,列表为每个图像呈现 180w、180h 的空间,网格尺寸给出了可用的完整尺寸:180 宽度和自动高度。然后,一旦加载了图像,图像区域就会缩小到网格的宽度限制(180),并且它的高度会按比例缩放(120)。所以效果是列表项以 180 x 180 的正方形绘制,然后在图像加载后缩小到 180 x 120。

我希望在下载图像源之前,图像元素的尺寸为 0,0。我希望在加载图像之前,每个项目的内容都不会占据任何高度;该区域不应以 180 小时开始。

这个问题是设计的吗?是否有任何已知的解决方法来处理它?我的真实代码在本地加载的同一网格位置中有一个默认图像,而最终图像的下载尚未完成。它的尺寸与加载的图像源相同,因此在图像加载时占位符图像的顶部和底部之间存在间隙,然后网格空间缩小到它应该一直存在的位置。太恶心了。

【问题讨论】:

  • 我知道这很糟糕,但您是否尝试过颠倒行/列定义的顺序?那里有奇怪的异常,所以值得一问......
  • 我尝试过您的建议,但不幸的是,更改顺序并没有改变任何东西。如果有的话就有点吓人了。
  • 我做了一个小实验,得到了同样的结果!感谢您的尝试!我唯一的其他建议是将图像放入第 1 行第 1 列的容器中。这可能是一场疯狂的追逐,但你永远不会知道。
  • 感谢您复制 Gayot 这个实验。听起来这不是一个有明显修复的众所周知的问题,所以我将坚持明确设置网格高度以强制正确行为的低条解决方案。
  • 一切都没有丢失。有一个叫做“Clemens”的用户对这些东西了如指掌。希望他能对您的问题发表意见,并且您会准备就绪。

标签: c# wpf image


【解决方案1】:

显然,当 Image 的 Stretch 属性设置为 None 以外的任何其他值时,ListBoxItem(包含 Grid 和 Image)会以某种方式强加初始为方形尺寸的布局。当Source 最终加载时,布局将重新计算为真实尺寸。 ItemsControl(而不是 ListBox)中的相同 DataTemplate 不会显示此行为。

幸运的是,Image 控件还有一个StretchDirection 属性,您可以将其设置为DownOnly 以防止最初的方形布局。缺点是,这仅在您的图像不必从小于 180 的宽度开始拉伸的情况下才有效。

<Image Source="{Binding Url}" Stretch="Uniform" StretchDirection="DownOnly"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2014-11-08
    • 2021-04-23
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多