我正在为一个大学项目(学期长)做一个二十一点游戏,我遇到了一个我似乎无法克服的路障。
我正在尝试加载卡片图像,以便它们可以在屏幕上显示,但我一直没有非常这样做。我有绝对的参考资料;我可以从那些加载,但任何从相对路径加载的尝试都会失败。该项目必须是独立的;我无法指示我的教授将这些图像复制到根目录上。
#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;
答案 0 :(得分:7)
您可以使用:
Uri uri = new Uri(@"FolderName\FileName.png",UriKind.Relative);
PngBitmapDecoder decoder2 = new PngBitmapDecoder(uri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
请记住将图像文件的属性设置为(否则编译器将跳过它们)您可以在构建后查看bin / debug文件夹并验证该文件应该位于何处:
另一种选择是将文件设为embedded resource,然后您可以像这样访问它:
Bitmap bitmap = Properties.Resources.FileName;
答案 1 :(得分: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。重命名&#34; MyBlackJackAssembly&#34;到你的项目的大会名称。
<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的任何内容。然后,您可以将您的标签添加到用户界面上的网格中,我不确定您如何在屏幕上显示您的卡片。
对于二十一点应用程序,我可能会创建一个名为&#34; Card&#34;为了能够生成这种类似的东西。这封装了卡片生成&#34;将逻辑转换为自己的控件,以便其余代码可以专注于处理卡片。
XAML:
<myControls:CardImage Kind="Spades" Digit="1" />
或者在c#中这样:
CardImage aCard = new CardImage();
aCard.Kind = CardImage.Kinds.Spades; //enum
aCard.Digit = 1;
答案 2 :(得分:1)
我正在加载一些在项目资源中导入的背景图像:
this.staticBg.Source = new BitmapImage(
new Uri(@"/Project;component/Images/" + ((App)App.Current).bgImage
+ ".jpg", UriKind.Relative));
“项目”是项目名称。 所以基本上你应该将图像添加到资源并用相对的uri调用它们。