5

私は大学 (学期) のプロジェクトでブラックジャック ゲームを作成していますが、乗り越えられないように思われる障害にぶつかりました。

画面に表示できるようにカード画像を読み込もうとしていますが、うまくいきません。絶対参照がダウンしています。それらからロードできますが、相対パスからロードしようとすると失敗します。プロジェクトはスタンドアロンである必要があります。これらのイメージをルートにコピーするよう教授に指示することはできません。

#if FROMDISK
        Uri myUri = new Uri(@"C:\cards\" + getFilename(r, s, "png"), UriKind.Absolute);
        PngBitmapDecoder decoder2 = new PngBitmapDecoder(myUri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        BitmapSource bmp = decoder2.Frames[0];
#else
        System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
        Stream myStream = myAssembly.GetManifestResourceStream("Blackjack." + getFilename(r, s, "png"));
        BitmapImage bmp = new BitmapImage();
        bmp.StreamSource = myStream;
#endif
        // Draw the Image
        im.Source = bmp;
        im.Stretch = Stretch.Uniform;
        im.Width = CARD_WIDTH;

(環境)

4

3 に答える 3

7

次を使用できます。

Uri uri = new Uri(@"FolderName\FileName.png",UriKind.Relative);
PngBitmapDecoder decoder2 = new PngBitmapDecoder(uri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);

イメージファイルのプロパティを次のように設定することを忘れないでください(そうしないと、コンパイラはそれらをスキップします)。ビルド後にbin / debugフォルダーを調べて、ファイルが本来あるべき場所にあることを確認できます。

  • ビルドアクション:コンテンツ
  • 出力ディレクトリにコピー:常にコピー

もう1つのオプションは、ファイルを埋め込みリソースにして、次のようにアクセスできるようにすることです。

Bitmap bitmap = Properties.Resources.FileName;
于 2012-10-25T23:30:28.223 に答える
3

XAML で画像をリソースとして宣言するのが好きです。この時点ではまだコード構造をいじることができると思いますが、新しい概念があまり多くないことを願っています。これが私がそれを行う方法です:

プロジェクトに「Images」というフォルダーを作成します。カードの画像を Visual Studio のフォルダーにドラッグ アンド ドロップして追加します。「ビルド アクション」がリソースに設定されていることを確認します。

CTRL-SHIFT-A を押して、新しい「リソース ディクショナリ」を作成します。CardImages.xaml という名前を付けます。

このファイルを App.xaml で次のようにリンクします (一度に複数の XAML ファイルをリンクする方法を示しますが、この場合はもちろん「AnyDictionary」行を削除してください)。

App.XAML:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Controls/CardImages.xaml" />
            <ResourceDictionary Source="Controls/AnyDictionaryYouWant.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

このコードを CardImages.xaml に追加します。「MyBlackJackAssembly」の名前をプロジェクトのアセンブリ名に変更します。

<Style TargetType="Image">
    <Setter Property="RenderOptions.BitmapScalingMode" Value="HighQuality" />
</Style>

<DataTemplate x:Key="Spade1">
    <Image Source="MyBlackJackAssembly;component/Images/Spade1.png" />
</DataTemplate>

<DataTemplate x:Key="Spade2">
    <Image Source="MyBlackJackAssembly;component/Images/Spade2.png" />
</DataTemplate>

次に、次のようにコード内でそれらを見つけることができます。

Label label = new Label();
label.ContentTemplate = (DataTemplate)label.FindResource("Spade1");

これにより、カードを表示する WPF Label オブジェクトが取得されます。この手法は、ContentTemplate をサポートするすべてのもので機能します。その後、ラベルを UI のグリッドに追加できます。カードを画面に表示する方法がわかりません。

ブラックジャック アプリケーションの場合、このようなものを生成できるようにするために、おそらく「Card」という UserControl を作成します。これにより、「カード生成」ロジックが独自の Control にカプセル化されるため、コードの残りの部分はカードの処理に集中できます。

XAML:

<myControls:CardImage Kind="Spades" Digit="1" />

または、C# で次のようにします。

CardImage aCard = new CardImage();
aCard.Kind = CardImage.Kinds.Spades; //enum
aCard.Digit = 1;
于 2012-10-26T00:09:34.270 に答える
1

プロジェクトのリソースにインポートされた背景画像をロードする方法:

this.staticBg.Source = new BitmapImage(
    new Uri(@"/Project;component/Images/" + ((App)App.Current).bgImage
                                          + ".jpg", UriKind.Relative));

「Project」はプロジェクト名です。したがって、基本的にはリソースに画像を追加し、相対 uri で呼び出す必要があります。

于 2012-10-25T23:09:15.913 に答える