我正在为我所在城市的比赛做一个小项目......我只是碰到了一堵砖墙。事情是:我在Blend中创建一个userControl(让我们说一个画布,我有一个反应角。 .a文本块和图像)。我的问题是我无法通过代码将其添加到WPF中的listboxitem。在设计器中逐个添加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。
我正在等待你对如何解决这个问题的想法,如果你对我的情况中最适合使用的其他东西有什么了解,那将会很棒。谢谢你!
答案 0 :(得分:2)
正确处理此类情况的方法是使用包含问题集合的数据模型。然后将ListBox.ItemsSource绑定到集合并提供使用UserControl的DataTemplate。
答案 1 :(得分: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);
}
}
在您的设计区域中,创建一个列表并将绑定它到您创建的Questions集合中。问题在列表中的显示方式由“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>
就像我上面所说的那样,许多事情在这一点上可能没有意义,所以请务必阅读它们:什么是数据绑定,什么是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;
}
答案 2 :(得分:1)
使用ListBox的ItemTemplate来定义您希望对象的每个实例看起来像什么,然后将ListBox的ItemsSource绑定到该类型的集合。
答案 3 :(得分:0)
您需要创建控件的集合(例如List)并将集合绑定到ListBox。