Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UWP GridView图像拉伸错误_C#_Image_Gridview_Uwp_Stretch - Fatal编程技术网

C# UWP GridView图像拉伸错误

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

我将GridView控件绑定到具有BitmapImage属性的对象集合。GridView项目模板的图像控件具有固定的大小,而实际图片的大小可能不同,可以小于或大于图像。因此,我对较大的图片使用Stretch=Uniform,对较小的图片使用Stretch=None。我在已加载事件的图像上设置了拉伸属性:

    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>