Как создать приложение метро с динамическим управлением изображениями

Я пытаюсь получить информацию из XML-документа, который показывает всю информацию о моих друзьях xbox live. Что я хочу сделать сейчас, так это отобразить аватар в элементе управления изображением, который создается динамически, но я не уверен, как я мог бы на самом деле отображать это изображение в сетке моего приложения.

До сих пор я пытался создать динамический элемент управления с использованием тега игрока и добавить к нему свой собственный текст. Это код до сих пор:

        string gamertag, avatarURL;
        foreach (XElement elm in doc.Descendants().Elements("Friends"))
        {

            gamertag = elm.Element("Gamertag").Value;
            avatarURL = elm.Element("AvatarLarge").Value;

            Image friendimage = new Image();
            friendimage.Name = gamertag.ToString() + "ImageControl";

            BitmapImage AccountPicbitmap = new BitmapImage();
            AccountPicbitmap.UriSource = new Uri(avatarURL);

            friendimage.Source = AccountPicbitmap;
            //Some code to display this control with the avatar image using the URL retrieved, I want to play these tiles side by side

        }

Любые предложения о том, как я могу это сделать? Заранее спасибо!

ОБНОВЛЕНИЕ: я добавил этот элемент управления в свой XAML, но теперь я получаю некоторые странные исключения: System.Runtime.Remoting.RemotingException [7756] Процесс конструктора неожиданно завершен!

<ItemsControl HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="1249" Margin="55,484,0,0" ItemsSource="{Binding}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding avatarURL}" Name="{Binding GamerTag}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>

</ItemsControl>

Теперь, когда я отлаживаю приложение, оно переходит в бесконечный цикл и также выдает исключение при инициализации.

public MainPage()
    {
        this.InitializeComponent();
    }

person nGX    schedule 07.10.2012    source источник
comment
Почему вы не делаете это в xaml? На xaml гораздо проще сделать что-то подобное.   -  person N_A    schedule 07.10.2012
comment
Ну, у меня есть дизайн xaml, но это код, как мне это сделать с xaml?   -  person nGX    schedule 08.10.2012


Ответы (1)


Это было бы проще сделать в xaml примерно так:

Во-первых, установите DataContext вашей страницы на вашу модель просмотра. Затем создайте свойство, которое предоставляет вашу коллекцию друзей как набор объектов, которые предоставляют GamerTag и avatarURL. Используйте следующий код xaml для отображения этой коллекции:

<ItemsControl ItemsSource="{Binding}">
    <ItemsControl.DataTemplate>
        <DataTemplate>
            <Image Source="{Binding avatarURL}" Name="{Binding GamerTag}"/>
        </DataTempate>
    </ItemsControlDataTempalte>
</ItemsControl>

Код позади должен быть примерно таким:

public class yourCodeThatGetsYourFriends : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void GetFriends()
    {
        //get friends and put into friend objects defined below
        //create an ObservableCollection of them and assign it to the Friends (make sure its 'Friends' not 'friends") property
    }
    public ObservableCollection<friend> friends;
    public ObservableCollection<friend> Friends;
    {
        get
        {
            return friends;
        }
        set
        {
            friends = value;
            NotifyPropertyChanged("Friends");
        }
    }        

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

}

public class friend : INotifyPropertyChanged
{        
    public event PropertyChangedEventHandler PropertyChanged;

    string url;
    public string avatarURL
    {
        get
        {
            return url;
        }
        set
        {
            url = value;
            NotifyPropertyChanaged("avatarURL");
        }
    }
    string tag;
    public string GamerTag
    {
        get
        {
            return tag;
        }
        set
        {
            tag= value;
            NotifyPropertyChanaged("GamerTag");
        }
    }

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

}
person N_A    schedule 07.10.2012
comment
Проверьте исходный вопрос с кодом, который я добавил. Я не смог найти те же элементы управления, о которых вы упомянули, поэтому я использовал то, что, по моему мнению, было бы лучше всего, а именно ItemsControl. - person nGX; 11.10.2012
comment
Я думаю, что mydogisbox пытается объяснить, что вам нужно 1) создать класс с некоторыми свойствами, такими как GamerTag, avatarURL и т. д. 2) Разобрать XML и заполнить свой класс проанализированными данными. 3) Еще в коде установите DataContext с экземпляром только что созданного вами класса. - person Ewerton; 11.10.2012
comment
Вы ASP.NET-разработчик? Обычный разработчик asp.net пытается найти FindControl в коде, когда они инициируют обучение wpf. В WPF действует правило: пусть для xaml выполняются задачи проектирования, в коде программной части вы должны (предпочтительно) выполнять бизнес-код. - person Ewerton; 11.10.2012
comment
Есть лучшие способы сделать это, но я просто привел базовый пример модели представления. - person N_A; 12.10.2012