web-dev-qa-db-ja.com

指定されたSystem.UriをWindows.Foundation.Uriに変換することはできません

XAMLMetroアプリにBitmapImageをプログラムで読み込もうとしています。これが私のコードです:

var uri = new Uri("/Images/800x600/BackgroundTile.bmp", UriKind.RelativeOrAbsolute);
var imageSource = new BitmapImage(uri);

2行目はSystem.ArgumentExceptionでクラッシュします。

指定されたSystem.UriをWindows.Foundation.Uriに変換することはできません。詳細については、 http://go.Microsoft.com/fwlink/?LinkID=215849 を参照してください。

リンクはMSDNホームページに移動するだけなので、役に立ちません。

WinRTが相対URIについて異なる期待を持っている場合に備えて、先頭の/も削除しようとしましたが、それでも同じ例外が発生します。

完全に有効なURIと思われるものに対してこの例外が発生するのはなぜですか?

29
Joe White

コンシューマープレビューでは、正しいURL形式がms-appx:/Images/800x600/BackgroundTile.bmpに変更されたようです。

33
Sander

Windows.Foundation.Uriのドキュメント から判断すると、WinRTは相対URIをサポートしていないようです。 pack:// URI 、しかしそれは私にUriFormatExceptionを与えたので、どうやらそれはWinRTでもそれを行う方法ではありません。

このスレッド で答えを見つけました:MSはWinRTリソース用にさらに別のURI形式を発明しました。これは機能します:

new Uri("ms-resource://MyAssembly/Images/800x600/BackgroundTile.bmp")

実際のアセンブリ名は追加しないことに注意してください。MyAssemblyの部分はリテラルテキストです。

17
Joe White

次のように、ページのBaseUriプロパティまたは画像コントロールのBaseUriプロパティを使用する必要があります。

//using the page's BaseUri property
BitmapImage bitmapImage = new BitmapImage(this.BaseUri,"/Images/800x600/BackgroundTile.bmp");
image.Source = bitmapImage;

または

//using the image control's BaseUri property
image.Source = new BitmapImage(image.BaseUri,"/Images/800x600/BackgroundTile.bmp");

あなたは理由と解決策を見ることができます ここ

3
Sunday Okpokor

これはXAMLでは機能しますが、コードでは機能しません...したがって、各コントロールまたはページには、アセットの適切なURIを構築するために使用できるBaseUriプロパティがあります...次に例を示します。

    imageIcon.Source = new BitmapImage(new Uri(this.BaseUri, "Assets/file.gif"));

//または、imageIconのベースURIを使用します。同じことです。

    imageIcon.Source = new BitmapImage(new Uri(imageIcon.BaseUri, "Assets/file.gif"));

また、ビルドアクションを埋め込みリソースではなく「コンテンツ」に設定する必要があります...それ以外の場合は、ms-resource://プロトコルを使用する必要があります。

0
Zia Ur Rahman

それでも問題が解決しない場合、またはリンクを開くためのアプリを探すように求められている場合は、WebViewを使用しようとしていますか?その場合は、ms-appxの代わりにms-appx-webを使用してみてください。

例:

this.webBrowser.Navigate(new Uri("ms-appx-web:///level/level/level/index.html"));

また、URIKindパラメーターがないことにも注意してください。これらのインスタンスでは明らかに必要ありません。

(私はあなたを信じていますかもしれませんあなたの参照に応じて先頭のスラッシュを変える必要があります)

0
matthewsheets

MVVM;)

    public static ImageSource SetImageSource(string uriPath)//.com/image or some path
    {
        // this method very good for mvvm ;)
        try
        {   
            //In Model - public ImageSource AccountPhoto { get; set; } 
            //AccountPhoto = SetImageSource("some path");
            return return new BitmapImage()
            {
                CreateOptions = BitmapCreateOptions.IgnoreImageCache,
                UriSource = new Uri(uriPath)
            };
        }
        catch
        {
            Debug.WriteLine("Bad uri, set default image.");
            return return new BitmapImage()
            {
                CreateOptions = BitmapCreateOptions.IgnoreImageCache,
                UriSource = new Uri("ms-appx:///Avatar/Account Icon.png")
            };
        }
    }

私はこれが古いことを知っていますが、これが役立つことを願っています。私はこれをXAMLで作成しましたが、うまくいきました。私が使用しているIdeは、vs-2015とwin-10です。

<Window>
<Grid>
<Grid.Background>
<ImageBrush ImageSource="NameOfYourImage.JPG or any Image type"/>
</Grid.Background>
<GroupBox x:Name="groupBox" Header="GroupBox" HorizontalAlignment="Left"   Height="248" Margin="58,33,0,0" VerticalAlignment="Top" Width="411">
<GroupBox.Background>
<ImageBrush ImageSource="NameOfYourImage.JPG or any Image type"/>
</GroupBox.Background>
</GroupBox>
</Grid>
</Window>
0
Bernard White