关于wpf:Xaml Image.Source在C#中未更新

Xaml Image.Source is not updating in C#

我在更新Xaml中的图像源时遇到了一些麻烦。我正在制作Windows应用商店应用,然后尝试在C#代码中设置源。基本上,我的小程序正在做的是让用户选择JPG文件,然后将其复制到AppData文件夹中。在我的应用程序中,我希望显示用户上传的图片。除了显示图像的那部分以外,其他所有东西都在工作,即使提供新的来源,该图像也不想更改。

C#代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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中的图像就是这样的

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

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

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


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

1
2
3
4
5
6
7
8
9
var imageFile = await picker.PickSingleFileAsync();
var bitmap = new BitmapImage();

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

ProfilePic.Source = bitmap;