Добавить userControl в список - PullRequest
1 голос
/ 09 марта 2012

Я работаю над небольшим проектом для конкурса в моем городе ... и я просто ударился о кирпичную стену. Дело в том, что я создаю пользовательский элемент управления в Blend (скажем, холст, в котором у меня есть реагирующий элемент)..a текстовый блок и изображение). Моя проблема в том, что я не могу добавить это к элементу списка в WPF с помощью кода. Добавление userControl по одному в конструкторе, кажется, работает .. но программное обеспечение будет работать с переменным числомэлементов для списка.

    private void mainPane1_Loaded(object sender, RoutedEventArgs e)
    {
         MessageBox.Show("layout updated");
        questions cq;
        Button btn;

        for (int i = 1; i <= 10; i++)
        {
            btn = new Button();
            btn.Content = "intreb" + i.ToString();
            cq = new questions();
            Canvas.SetZIndex(cq, 17);
            //cq.questionHolder.Text = "intrebare" + i.ToString();
            listaintrebari.Items.Add(cq);
            MessageBox.Show("intrebare" + i.ToString());
            listaintrebari.Items.Add(btn);
            //MessageBox.Show("layout updated");

        }

    }

Вопросы - это мой UserControl, а listaintrebari - это список. Я пытался добавить несколько кнопок, и он прекрасно работает ... но, похоже, ненавидит мой userControl.1005 * Я жду ваших мыслей о том, как решить эту проблему, и если у вас есть предположения о том, что лучше использовать в моей ситуации и как ... это было бы здорово. Спасибо!

Ответы [ 4 ]

2 голосов
/ 09 марта 2012

Хорошо, вот некоторый фактический код, который может вам помочь. Я буду использовать несколько концепций WPF, которые вы, возможно, захотите изучить дальше: DataBinding, DataTemplates, ImageSources, ObservableCollections

Сначала вам нужно создать (если у вас его еще нет) базовый класс для ваших Вопросов. Самое простое, что вы можете получить, было бы примерно так:

 internal class Question
 {
     public ImageSource QuestionImage { get; set; }
     public string QuestionText { get; set; }
 }

Затем в коде вашего экрана (да, мы еще не в MVVM), вы должны создать ObservableCollection of Question и добавить их в свои вопросы. У меня есть что-то вроде этого:

public ObservableCollection<Question> Questions { get; private set; }
public MainWindow()
{
    InitializeComponent();
    this.DataContext = this;
    Questions = new ObservableCollection<Question>();

    for (int i = 1; i <= 10; i++)
    {
        var newQ = new Question { QuestionText = "intrebarea " + i.ToString(), QuestionImage = _get your image as a ImageSource here_ };
        Questions.Add(newQ);
    }
}
  • this.DataContext = это очень важно, иначе привязка данных не будет работать.

В области дизайна создайте список и свяжите его с созданной коллекцией вопросов. Способ отображения вопроса в списке определяется параметром ItemTemlpate, как показано ниже.

<ListBox ItemsSource="{Binding Questions}">
  <ListBox.ItemTemplate>
    <StackPanel>
      <Image Source="{Binding QuestionImage}" Height="20" Width="20"/>
      <TextBlock Margin="5" Text="{Binding QuestionText}" />
    </StackPanel>
  </ListBox.ItemTemplate>
</ListBox>
  • Вы можете заменить имеющееся у меня содержимое UserControl или событие самого UserControl, но обязательно сохраните привязки к объектам в вашем классе Question.

Как я уже говорил выше, многие вещи могут не иметь смысла на этом этапе, поэтому обязательно прочитайте о них: что такое привязка данных, что такое DataContext, что такое ObservableCollection. Кроме того, попробуйте взглянуть на MVVM, когда у вас появится шанс ...

Наконец, если вы не знаете, как получить ImageSource, когда у вас есть jpg или png файл в вашем проекте:

public ImageSource GetImagesource(string location)
{
  var res = new BitmapImage()
  res.BeginInit();
  res.UriSource = new Uri("pack://application:,,,/ApplicationName;component/" + location);
  res.EndInit();

  return res;
}
2 голосов
/ 09 марта 2012

правильный способ справиться с подобной ситуацией - это иметь модель данных с набором ваших вопросов. Затем привяжите свой ListBox.ItemsSource к коллекции и предоставьте шаблон данных, который использует ваш UserControl.

1 голос
/ 09 марта 2012

Используйте ItemTemplate ListBox, чтобы определить, как должен выглядеть каждый экземпляр вашего объекта, а затем привяжите ItemsSource ListBox к коллекции этого типа.

0 голосов
/ 09 марта 2012

Вам необходимо создать коллекцию (например, List) вашего элемента управления и привязать коллекцию к ListBox.

...