C# UWP GridView图像拉伸错误
我将GridView控件绑定到具有BitmapImage属性的对象集合。GridView项目模板的图像控件具有固定的大小,而实际图片的大小可能不同,可以小于或大于图像。因此,我对较大的图片使用Stretch=Uniform,对较小的图片使用Stretch=None。我在已加载事件的图像上设置了拉伸属性:C# UWP GridView图像拉伸错误,c#,image,gridview,uwp,stretch,C#,Image,Gridview,Uwp,Stretch,我将GridView控件绑定到具有BitmapImage属性的对象集合。GridView项目模板的图像控件具有固定的大小,而实际图片的大小可能不同,可以小于或大于图像。因此,我对较大的图片使用Stretch=Uniform,对较小的图片使用Stretch=None。我在已加载事件的图像上设置了拉伸属性: private void img_ImageOpened(object sender, RoutedEventArgs e) { var img = sender
private void img_ImageOpened(object sender, RoutedEventArgs e)
{
var img = sender as Image;
if (img.Width > (img.Source as BitmapImage).PixelWidth)
{
img.Stretch = Stretch.None;
}
else
{
img.Stretch = Stretch.Uniform;
}
}
因此,这些图片非常适合:
但如果我清除绑定集合并再次填充,事情会变得非常混乱:
我花了很多时间试图解决这个问题。第二次没有调用Image_Loaded,所以我认为它与项目缓存有关。我尝试将CacheMode设置为null,但没有帮助。试图处理各种事件,但也没有成功
请帮忙
谢谢
-我删除了与问题无关的任何内容,只有90行代码
PS我找到了合适的订阅事件,它是Image\u DataContextChanges。看起来GridView项是重用的,更新时对象和特定的网格项可能会混淆。不会调用加载的图像,因此对象会进入具有任意拉伸的随机网格项。DataContextChanges每次都会触发,因此可以使用它动态更改拉伸方法
虽然有效,但我认为下面的克莱门斯解决方案更好。下次将使用它。我修复了您的代码,确保您在隐藏网格时完全清理了Stuff集合
Stuff=null
这意味着在Show_Click处理程序中,可以重新初始化集合
Stuff=newobserveCollection()代码>
如果继续使用绑定,则需要在执行此操作时发出PropertyChanged通知(推荐)。如果不想使用绑定,只需将ItemsSource重新设置为Stuff的新实例(见下文)
private void Show\u单击(对象发送者,路由目标)
{
Stuff=新的ObservableCollection();
foreach(source.Except(Stuff))Stuff.Add(s)中的var s;
gv.ItemsSource=材料;
}
私有无效隐藏\单击(对象发送者,路由目标)
{
东西;
Stuff=null;
}
您可以将图像控件放在一个视图框中,该视图框除了具有拉伸
属性外,还具有一个拉伸方向
属性,而不是在代码隐藏中调整图像的拉伸
属性。如果将其设置为DownOnly
,则图像将仅拉伸到较小的尺寸
<DataTemplate x:DataType="local:Thing">
<Border BorderBrush="Black" BorderThickness="1" Background="Black">
<Viewbox Width="48" Height="48" Stretch="Uniform" StretchDirection="DownOnly">
<Image Stretch="None" Source="{x:Bind Image}" />
</Viewbox>
</Border>
</DataTemplate>
我遇到了与此类似的问题,我只是确保没有一次又一次地将图像源重置为相同的图像!
<DataTemplate x:DataType="local:Thing">
<Border BorderBrush="Black" BorderThickness="1" Background="Black">
<Viewbox Width="48" Height="48" Stretch="Uniform" StretchDirection="DownOnly">
<Image Stretch="None" Source="{x:Bind Image}" />
</Viewbox>
</Border>
</DataTemplate>