我正在努力自学C#,而长时间的谷歌搜索还没有找到答案:
我有Rom,Game和Art课程。 Rom.Game.Art用于图像,因此定义为:
public class art
{
public Image Screen { get; set; }
public Image Marquis { get; set; }
public Image Logo { get; set; }
public art ()
{
BitmapImage Default_image = new BitmapImage();
Default_image.BeginInit();
Default_image.UriSource = new Uri(@"C:\Users\Major Major\Documents\Visual Studio 2013\Projects\Robin\Robin\images\bee_ace.png", UriKind.Absolute);
Default_image.EndInit();
this.Screen = new Image();
this.Screen.Source = Default_image;
this.Marquis = new Image();
this.Marquis.Source = Default_image;
this.Logo = new Image();
this.Logo.Source = Default_image;
}
}
我想创建一个Roms数组,并在循环中填充DataTable中的许多嵌套属性和子类。然而,在我进入循环之前,我只想获得一块测试代码。以下工作正常:
InitializeComponent();
BitmapImage Image_0 = new BitmapImage();
Image_0.BeginInit();
Image_0.UriSource = new Uri(@"E:\Arcade\Art\Box\Intellivision\Congo Bongo.jpg", UriKind.Absolute);
Image_0.EndInit();
ROMS.Insert(0, new Rom());
ROMS[0].Name = "Congo Bongo";
ROMS[0].Game.Art.Screen.Source = Image_0;
ROMS[0].Game.Date = "1983";
ROMS[0].Game.Platform = "Intellivision";
ROM_list.ItemsSource = ROMS;
我的抱怨是,如果我把它放在一个循环中,阵列中的所有图像都是相同的 - 它们将是最后输入的图像。看来表达“ROMS [0] .Game.Art.Screen.Source = Image_0;”将ROMS [0] .Game.Art.Screen.Source绑定到变量Image_0,而不仅仅是传递值(这对我来说似乎是令人惊讶的行为,但不用担心)。因此,为了保持填充ROMS [j] .Game.Art.Screen.Source,我必须创建一个与ROM数组分开的BitmapImages数组作为参考。我更喜欢的是在数组中实例化(?)BitmapImages,如下所示:
ROMS[0].Game.Art.Screen.Source = new BitmapImage();
InitializeComponent();
ROMS[0].Game.Art.Screen.Source.BeginInit();
ROMS[0].Game.Art.Screen.Source.UriSource = new Uri(@"E:\Arcade\Art\Box\Intellivision\Congo Bongo.jpg", UriKind.Absolute);
ROMS[0].Game.Art.Screen.Source.EndInit();
这不起作用。 Rom.Game.Art.Screen.Source不是BitMapImage,我找不到为其分配图像的方法。
所以我的问题,特别是: 1.有没有办法将图像源分配给ROMS [0] .Game.Art.Screen.Source而不创建单独存在的单独的BitmapImage,或者是愚蠢的?
有没有更聪明的方法来做我想做的事情?
是否有参考资料帮助我理解C#中无数图像类之间的关系?
对于罗嗦的问题感到抱歉,谢谢。
答案 0 :(得分:0)
我认为你应该对DataBinding做一些评论。您将节省更多时间。
你只需创建类似模特的东西:
ROM.Game.Art.Screen.Path =“meuPath.Jpg”;
myItemSource = ROMS;
最后,做一些像:
<ItemsControl x:Name="myItemSource">
<TextBlock Text="{Binding ROM.Game.Art.Screen.Name}"/>
<Image Source="{Binding ROM.Game.Art.Screen.Path,Converter=MyConverterImageToPath"/>
</ItemsControl>
答案 1 :(得分:0)
您需要为每个数组成员创建一个BitMapImage的新实例。如果将对象分配给变量,C#将使用引用。
ROMS[0].Game.Art.Screen.Source = Image_0;
这里你正在创建一个Image_0的引用,如果你现在做的话......
ROMS[1].Game.Art.Screen.Source = Image_0;
roms [0]和roms [1] .screen.source引用Image_0。如果你现在这样做:
ROMS[0].Game.Art.Screen.Source.UriSource = new Uri(@"E:\Arcade\Art\Box\Intellivision\Congo Bongo.jpg", UriKind.Absolute);
您更新Image_0并且所有rom.screen.source都引用Image_0并更新
如果要将Image_0用作所有的基本“图像”,您可以做的是调用bitmapImage的.Clone()函数,该函数创建对象的深层副本(新对象,而不是引用)。
所以在开头的某个地方你有:
InitializeComponent();
BitmapImage Image_0 = new BitmapImage();
Image_0.BeginInit();
Image_0.UriSource = new Uri(@"E:\Arcade\Art\Box\Intellivision\Congo Bongo.jpg", UriKind.Absolute);
Image_0.EndInit();
然后在你的循环中
ROMS[i].Name = "Congo Bongo";
ROMS[i].Game.Art.Screen.Source = Image_0.Clone();
ROMS[i].Game.Date = "1983";
ROMS[i].Game.Platform = "Intellivision";
答案 2 :(得分:0)
非常感谢你看这个。
深层复制概念具有指导意义,让我走上正轨。但仍然没有方法可以让我修改ROMS [i] .Game.Art.Screen.Source(这是Is Image.Source的类)。有趣的是,我可以将BitmapImage直接分配给Image.Source,但是我不能通过遍历类嵌套来改变BitmapImage。换句话说
ROMS [1] .Game.Art.Screen.Source.UriSource
不存在,即使ROMS [1] .Game.Art.Screen.Source设置为等于BitmapImage,它具有.UriSource。
所以,以你的评论作为起点,我提出了以下内容,它将在一个循环中工作,显然用循环变量代替每个字符串:
InitializeComponent();
ROMS.Insert(0, new Rom());
ROMS.Insert(1, new Rom());
ROMS[0].Name = "Congo Bongo";
ROMS[0].Game.Art.Screen.Source = new BitmapImage(new Uri(@"E:\Arcade\Art\Box\Intellivision\Congo Bongo.jpg", UriKind.Absolute));
ROMS[0].Game.Date = "1983";
ROMS[0].Game.Platform = "Intellivision";
ROMS[1].Name = "Donkey Kong";
ROMS[1].Game.Art.Screen.Source = new BitmapImage(new Uri(@"E:\Arcade\Art\Box\Intellivision\Donkey Kong.jpg", UriKind.Absolute));
ROMS[1].Game.Date = "1982";
ROMS[1].Game.Platform = "Intellivision";
ROM_list.ItemsSource = ROMS;
但是,每次修改Game.Image.Source时,我都要创建一个新的BitMapImage和Uri。我想知道旧的BitMapImage和Uri会发生什么,它们甚至没有名字,也无法修改。他们只是在记忆中徘徊永恒,困扰着生活变量吗?我还在做些傻事吗?