XAML UWP中的BitmapImage偶尔会显示错误图像

slmsl1lt  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(157)

我在UWP应用中显示头像时使用BitmapImage。有时头像会显示错误的图像(有时大小错误,有时甚至显示我从未在应用中使用过的图像)。
我在谷歌上搜索了一段时间,发现很少有人有同样的问题,但没有一个得到解决。例如,thisthis
下面是我的应用程序中的代码:

  • . xaml格式*
<Image>
  <Image.Source>
    <BitmapImage UriSource="{x:Bind Patient.Gender, Mode=OneWay, Converter={StaticResource GenderToAvatarConverter}}" />
  </Image.Source>
</Image>
    • 性别到头像转换器. cs**
public sealed class GenderToAvatarConverter : IValueConverter 
{
    object IValueConverter.Convert(object value, Type targetType, object parameter, string language)
    {
        var imagePath = "ms-appx:///Assets/Avatar/Default.png";
        if ((string)value == Gender.MALE.ToString())
        {
            imagePath = "ms-appx:///Assets/Avatar/Man.png";
        }
        else if((string)value == Gender.FEMALE.ToString())
        {
            imagePath = "ms-appx:///Assets/Avatar/Woman.png";
        }

        return new Uri(imagePath);
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

Displaying normally
Displaying wrong images
Displaying wrong images again
如果有人能解决这个问题或如何重现它,将不胜感激。

p4rjhz4m

p4rjhz4m1#

这是我找到的一种复制它的方法。
我有一个应用程序,其中有使用者,而使用者可以有影像。当您上载影像时,它会储存为0.png。BitmapImage会载入并显示它。然后我删除影像,因此影像文件夹是空的。接着我加入新的影像,并储存为0.png。这两个影像不同,但路径相同,BitmapImage控件会继续显示相同的影像。
由此,我假设当您从一个路径创建BitmapImage时,它首先检查其他地方是否已经创建了图像,然后该高速缓存来代替。(我还注意到您只能在UI线程上创建BitmapImage)。
为了解决这个问题,我发现你可以创建一个新的BitmapImage,并从流中加载它,而该图像将不会该高速缓存中找到。
只需添加一个转换器:

public class ImageToBitmapImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string culture)
        {
            BitmapImage bitmapImage = new BitmapImage();

            if (value is Image)
            {
                Image image = (Image)value;

                using (MemoryStream memoryStream = new MemoryStream())
                {
                    image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                    memoryStream.Position = 0;
                    bitmapImage.SetSourceAsync(memoryStream.AsRandomAccessStream());
                }

            }

            if (value is string)
            {
                using (FileStream file = new FileStream((string)value, FileMode.Open))
                {
                    IRandomAccessStream fileStream = file.AsRandomAccessStream();
                    bitmapImage.SetSource(fileStream);
                    fileStream.Dispose();
                }
            }

            return bitmapImage;
        }

        public object ConvertBack(object value, Type targetType, object parameter, string culture)
        {
            throw new NotImplementedException();
        }
    }

并像这样使用它:

<Page.Resources>
    <converters:ImageToBitmapImageConverter x:Key="ImageToBitmapImageConverter" />
</Page.Resources>

<Image Source="{Binding CroppedImagePath, Mode=OneWay, Converter={StaticResource ImageToBitmapImageConverter}}"/ >

相关问题