1

私は自分の街でコンテストのための小さなプロジェクトに取り組んでいます..そして私はちょうどレンガの壁にぶつかりました.事は:私は Blend で userControl を作成しています(キャンバスとしましょう,その中にリアクタンスがあります..テキストブロック私の問題は、これをコードでWPFのリストボックス項目に追加できないことです。デザイナーでuserControlを1つずつ追加すると機能するようです..しかし、ソフトウェアは可変数の項目で動作しますリストボックス。

    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が嫌いなようです。

この問題を解決する方法についてのご意見をお待ちしております。また、私の状況で他に何が最適で、どのように使用するかについて何か提案があれば..それは素晴らしいことです.ありがとう!

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 の 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 は非常に重要です。そうしないと、データ バインディングが機能しません。

デザイン領域でリストを作成し、作成した 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>
  • 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 に答える