【问题标题】:Xaml Image.Source is not updating in C#Xaml Image.Source 未在 C# 中更新
【发布时间】:2015-04-07 12:44:35
【问题描述】:

我在更新 Xaml 中的图像源时遇到了一些问题。我正在制作一个 Windows 应用商店应用程序,并试图在我的 C# 代码中设置源代码。基本上,我的小程序正在做的是让用户选择一个 JPG 文件,然后将其复制到 AppData 文件夹。在我的应用程序中,我希望显示用户上传的图片。除了我显示图像的部分外,一切正常,即使我提供新的来源,这张图像也不想改变。

C#代码:

public sealed partial class MainPage : Page
{
    FileOpenPicker pickerSelect;
    FileSavePicker pickerSave;

    StorageFolder folder;
    StorageFile pic;

    public MainPage()
    {
        this.InitializeComponent();
        InitializePickers();
        InitializeProfilePicture();
    }

    private async void InitializeProfilePicture()
    {
        folder = Windows.Storage.ApplicationData.Current.LocalFolder;    
        pic = await folder.GetFileAsync("profile.jpg");        

        BitmapImage uri = new BitmapImage(new Uri(pic.Path, UriKind.Absolute));
        ProfilePic.Source = uri;

    }

    private void InitializePickers()
    {
        pickerSelect = new FileOpenPicker();
        pickerSave = new FileSavePicker();
        pickerSelect.FileTypeFilter.Add(".jpg");

    }


    private async void Upload_Click(object sender, RoutedEventArgs e)
    {
        StorageFile pictureSelect = await pickerSelect.PickSingleFileAsync();
        StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder;
        await pictureSelect.CopyAsync(folder, "profile.jpg", NameCollisionOption.ReplaceExisting);
        InitializeProfilePicture();
    }
}

在“InitializeProfilePicture”方法中,我创建了一个新的 BitmapImage 并将 ProfilePic 设置为此。这段代码只工作一次,如果我像现在一样在开始时运行 InitializeProfilePicture,并且用户选择一张新图片并上传到 AppData 文件夹,则图像不会改变(即使图片确实已上传)。如果我从一开始就删除该方法并将其保留在 Button_Click 方法中,则将显示新上传的图片。但是在 ProfilePic 设置了来源后上传新图片,它不会改变。

Xaml 中的图像是这样的

Image Width="480" Height="640" x:Name="ProfilePic" Grid.Row="1" Grid.RowSpan="2"

..这里还有一个按钮可以运行 Upload_Click 方法,仅此而已。

知道为什么会这样吗?不应该更新吗??

【问题讨论】:

  • 那是因为图像在从 Uri 创建时被缓存。创建具有相同文件路径的新 BitmapImage 将返回缓存的图像。您应该打开一个文件流并调用 BitmapImage 的SetSourceSetSourceAsync 方法。
  • 我怀疑它与缓存有关。我用 SetSource 玩了一点,但我没有让它工作。这在代码中看起来如何??
  • 你为什么不直接从所选图片的路径创建BitmapImage,即pictureSelect.Path
  • 这实际上听起来像是一个聪明的解决方法。我现在尝试了一次,但图像变成了任何东西,即使路径是有效的......我真的无法忍受使用路径..我今天关闭了这些东西,但明天我会更好地尝试一些调试。感谢您迄今为止的建议:)
  • 从本地文件 Uri 加载 BitmapImage 似乎不起作用。但是,您可以轻松地直接从文件流中加载图像。看我的回答。

标签: c# wpf image xaml


【解决方案1】:

您可以像这样直接从文件中加载 BitmapImage:

var imageFile = await picker.PickSingleFileAsync();
var bitmap = new BitmapImage();

using (var stream = await imageFile.OpenReadAsync())
{
    await bitmap.SetSourceAsync(stream);
}

ProfilePic.Source = bitmap;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多