C#WPF带有图像的嵌套类数组

时间:2014-09-10 07:12:39

标签: c# arrays wpf imagesource

我正在努力自学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,或者是愚蠢的?

  1. 有没有更聪明的方法来做我想做的事情?

  2. 是否有参考资料帮助我理解C#中无数图像类之间的关系?

  3. 对于罗嗦的问题感到抱歉,谢谢。

3 个答案:

答案 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)

非常感谢你看这个。

深层复制概念具有指导意义,让我走上正轨。但仍然没有方法可以让我修改ROM​​S [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会发生什么,它们甚至没有名字,也无法修改。他们只是在记忆中徘徊永恒,困扰着生活变量吗?我还在做些傻事吗?