2012-10-25 114 views
4

我正在为大学项目制作一个二十一点游戏(学期 - 长),我碰到了一块我似乎无法克服的障碍。从相对路径加载图片

我想加载卡图像,以便它们可以在屏幕上显示,但我一直在这样做的一点运气。我有绝对的参考文献;我可以从这些加载,但任何尝试从相对路径加载失败。该项目必须是独立的;我无法指示我的教授将这些图像复制到根部。

#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; 

(Context)

回答

5

您可以使用:

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

记住图像文件的属性设置为(否则编译器将跳过它们),你可以看看的bin/debug文件夹中生成后,确认该文件是它应该是:

  • 生成操作:content
  • 复制到输出目录:复制始终

另一种选择是让一个embedded resource那么你就可以访问它像这样的文件:

Bitmap bitmap = Properties.Resources.FileName; 
+0

我应该为哪些文件设置这些属性?设置他们的代码文件似乎是错误的举动(我会说实话:我不知道他们真的) –

+0

@vermiculus更新答案 –

+0

我不知道为什么这么没有通知我所有的这个,但我会试试这个,当我回家! –

1

的办法,我是装在该项目的资源进口了一些背景图片:

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

其中,“项目”是项目名称。 所以基本上你应该把图像添加到资源并用相对的URI来调用它们。

+0

我修改了代码改为:'im.Source =新的BitmapImage(新的URI(@“/项目;组件/图片/“+ getFilename(r,s,”png“),UriKind.Relative))' - 这是正确的吗?因为它似乎没有工作。这不是抛出一个错误,只是没有显示出来。 '图像'是您制作的某个文件夹吗? –

+0

@vermiculus为了让您的应用程序保持图像(并且不需要使用#FROMDISK?),您必须将图像拖放到Visual Studio中的项目中。然后你确定他们的Build Action被设置为“Resource”(但通常这已经OK了)。然后你可以像克隆说的那样引用它,或者你可以通过创建一个用作窗口的可视对象的UserControl对象来尝试更多的“WPF”方法。 – Joe

+0

嗨,我创建了Images文件夹,方法是右键单击项目名称并选择Add-> New Folder。然后通过右键单击图像文件夹并选择添加 - >现有项目来导入实际图像。 构建操作设置为“内容”,并将“复制到输出”复制为“始终复制”(如果要加快构建,也可以将其复制为“较新”)。 – Clone

3

我想声明的图像在我的XAML资源。我会假设你现在仍然可以在代码结构中使用,并且希望没有太多新的概念给你。以下是我的工作方式:

开始在您的项目中创建一个名为“Images”的文件夹。通过将它们拖放到Visual Studio中的文件夹来添加卡片的图像。确保他们的“构建操作”设置为资源。

按CTRL-SHIFT-A创建一个新的“资源字典”。将其命名为CardImages.xaml。

链接此文件中的App.xaml像这样

的App.xaml(展示如何将多个XAML文件一次连结,但是对于这门课程的删除“AnyDictionary”行!):

<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的任何内容。然后,您可以将您的标签添加到您的用户界面上的网格,我不确定如何在屏幕上显示您的卡片。

对于二十一点应用,我想大概是为了创建一个名为“卡”用户控件,以便能够产生一种像这个它。这将“卡片生成”逻辑封装到自己的控制中,所以其余的代码可以专注于处理卡片。

XAML:

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

或者这样在C#:

CardImage aCard = new CardImage(); 
aCard.Kind = CardImage.Kinds.Spades; //enum 
aCard.Digit = 1; 
+1

我不知道为什么SO没有通知我所有这些,但我只想说我非常兴奋回家尝试这个! C#是一种疯狂的方便语言。 –