【问题标题】:Image.Source = new BitmapImage(); doesn't work in UWPImage.Source = new BitmapImage();在 UWP 中不起作用
【发布时间】:2021-09-15 19:36:56
【问题描述】:

我在用 C# 读取文件时遇到问题。代码如下:

protected override void OnNavigatedTo(NavigationEventArgs EvArgs)
    {
        base.OnNavigatedTo(EvArgs);
        var Args = EvArgs.Parameter as Windows.ApplicationModel.Activation.IActivatedEventArgs;
        var FArgs = Args as Windows.ApplicationModel.Activation.FileActivatedEventArgs;
        if (Args != null)
        {
            if (Args.Kind == Windows.ApplicationModel.Activation.ActivationKind.File)
            {
                var IMG = new Image();
                IMG.Loaded += IMG_Loaded;
                string FP = FArgs.Files[0].Path;
                Uri = FP;
                IMG.Source = new BitmapImage(new Uri(FP, UriKind.RelativeOrAbsolute));
                FV.Items.Add(IMG);
                PathBlock.Text = FArgs.Files[0].Name + " - Ivirius Image Viewer";

                void IMG_Loaded(object sender, RoutedEventArgs e)
                {
                    IMG.Source = new BitmapImage(new Uri(Uri));
                }
            }
        }
        if (Args == null)
        {
            PathBlock.Text = "Ivirius Image Viewer";
        }
    }

问题出在这部分:

IMG.Source = new BitmapImage(new Uri(FP, UriKind.RelativeOrAbsolute));

即使在尝试应用程序可以在其自己的文件中访问的资源之后,图像也不会加载:

IMG.Source = new BitmapImage(new Uri("ms-appx:///09.png, UriKind.RelativeOrAbsolute));

还是不行。 这仅适用于以下代码:

var FOP = new Windows.Storage.Pickers.FileOpenPicker();
StorageFile F = await FOP.PickSingleFileAsync();
IRandomAccessStream FS = await F.OpenAsync(FileAccessMode.Read);
var BI = new BitmapImage();
var IMG = new Image();
await BI.SetSourceAsync(FS);
IMG.Source = BI;

遗憾的是,我不能在第一个代码示例中使用文件流或文件选择器,所以我不能像这里那样让它工作。

【问题讨论】:

    标签: c# file uwp registry file-type-associations


    【解决方案1】:

    Image.Source = new BitmapImage();在 UWP 中不起作用

    问题是文件Path属性不用于直接在UWP平台设置图像源。 从您的代码派生,它看起来您使用当前应用程序打开图像文件,如果您可以从FArgs.Files 列表中获取IStorageItem,您也可以将其转换为StorageFile,然后将打开的文件流传递给@987654325 @。

    更详细的步骤请参考以下代码。

    protected async override void OnNavigatedTo(NavigationEventArgs EvArgs)
    {
        base.OnNavigatedTo(EvArgs);
        var Args = EvArgs.Parameter as Windows.ApplicationModel.Activation.IActivatedEventArgs;
        var FArgs = Args as Windows.ApplicationModel.Activation.FileActivatedEventArgs;
        if (Args != null)
        {
            if (Args.Kind == Windows.ApplicationModel.Activation.ActivationKind.File)
            {
                var IMG = new Image();
                string FP = FArgs.Files[0].Path;
                var Uri = FP;
                StorageFile imageFile = FArgs.Files[0] as StorageFile;
                using (var stream = await imageFile.OpenReadAsync())
                {
                    var bitmp = new BitmapImage();
                    bitmp.SetSource(stream);
                    IMG.Loaded += (s, e) => { IMG.Source = bitmp; };
                }
    
                RootLayout.Children.Add(IMG);
            }
        }
        if (Args == null)
        {
    
        }
    }
    

    【讨论】:

    • 谢谢!这个解决方案效果很好!
    猜你喜欢
    • 2017-12-03
    • 2012-09-23
    • 1970-01-01
    • 2016-06-19
    • 2016-03-25
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多