1

我正在为我的城市的一场比赛做一个小项目。我刚刚碰到了一堵砖墙。问题是:我正在 Blend 中创建一个用户控件(比如说一个画布,我有一个反应角度 ..一个文本块和图像)。我的问题是我无法通过代码将其添加到 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");

        }

    }

问题是我的用户控件,listaintrebari 是列表框。我尝试添加一些按钮,效果很好……但它似乎讨厌我的用户控件。

我正在等待您对如何解决此问题的想法,如果您对在我的情况下最好使用什么以及如何使用其他方法有任何建议......那会很棒。谢谢!

4

4 回答 4

2

处理这种情况的正确方法是使用包含问题集合的数据模型。然后将您的 ListBox.ItemsSource 绑定到该集合并提供一个使用您的 UserControl 的 DataTemplate。

于 2012-03-09T16:44:29.193 回答
2

好的,这里有一些可能对您有所帮助的实际代码。我将使用几个您可能想要进一步研究的 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 = this 很重要,否则你的Data Binding 将不起作用。

在您的设计区域中,创建一个列表并将其绑定到您创建的 Questions 集合。问题在列表中的显示方式由“ItemTemplate”驱动,如下所示。

<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>
  • 您可以将 I have there 替换为您的 UserControl 内容或事件 UserControl 本身,但请确保将绑定保留到您的 Question 类中的对象。

就像我上面说的,很多事情在这一点上可能没有意义,所以一定要阅读它们:什么是数据绑定,什么是 DataContext,什么是 ObservableCollection。另外,如果有机会,请尝试查看 MVVM ......

最后,如果您在项目中有 jpg 或 png 文件时不确定如何获取 ImageSource:

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

  return res;
}
于 2012-03-09T17:06:28.360 回答
1

使用 ListBox 的 ItemTemplate 定义您希望对象的每个实例看起来像什么,然后将 ListBox 的 ItemsSource 绑定到该类型的集合。

于 2012-03-09T16:47:50.927 回答
0

您需要为您的控件创建一个集合(例如 List)并将该集合绑定到 ListBox。

于 2012-03-09T16:43:16.900 回答