将多个内容添加到列表框。 C#,WPF

时间:2014-02-05 16:27:31

标签: c# wpf xaml listbox

我的WPF应用程序有一个包含多个项目的列表框。在每个项目上,我们都有一个图像和一个文本框。

请参阅下面的XAML:

      <ListBox x:Name="lstMagic" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="10,200,10,0" Width="Auto" Height="558" Background="{x:Null}" BorderBrush="Transparent">

            <ListBoxItem>
                <StackPanel Orientation="Horizontal">
                    <Image Source="images/plates/pig.jpg" Margin="0,0,5,0" Width="72"/>
                    <TextBox IsReadOnly="True"  Background="{x:Null}" Foreground="White" Width="912">Some Magic is going to happen</TextBox>
                </StackPanel>
            </ListBoxItem>

所以列表从猪开始按预期开始。在猪面前,他成功地装了猪。

除了表单部分,我还有一个按钮。我能够在该按钮上添加一个新的listBoxItem。

        private void btnDoMagic(object sender, RoutedEventArgs e)
    {
        ListBoxItem newMagic = new ListBoxItem();
        Image imageCurrent = new Image();
        imageCurrent.Source = new BitmapImage(new Uri("images/plates/someOtherImage.jpg", UriKind.RelativeOrAbsolute));
        newMagic.Content = imageCurrent;
        lstCardapio.Items.Add(newMagic);
    }
}

此功能有效,并将图像成功添加到列表中!但我有一些问题: 我怎样才能像我的第一个XAML一样?图像和文本框?如何在我的按钮事件中添加这些?

我需要这样做,因为我们将从数据库中获取这些项目,因此我们必须动态加载这些项目。

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你想要完全复制你的XAML层次结构,除了在代码中,然后将它添加到ListBox?

如果你想直接在那时创建控件in-code,你可以使用这样的东西:

    // This method creates your controls and returns a listBoxItem with the specified content.
    private ListBoxItem createObject(String imgSource, String text)
    {
        var newImage = new Image() 
            { 
                Source = new BitmapImage(new Uri(imgSource, UriKind.RelativeOrAbsolute)), 
                Width = 72, 
                Margin = new Thickness(0, 0, 5, 0) 
            };
        var newTextBox = new TextBox() 
            { 
                IsReadOnly = true, 
                Background = Brushes.Transparent, 
                Foreground = Brushes.White, 
                Width = 912, 
                Text = text 
            };

        var newStackPanel = new StackPanel() { Orientation = Orientation.Horizontal };

        newStackPanel.Children.Add(newImage);
        newStackPanel.Children.Add(newTextBox);

        return new ListBoxItem() { Content = newStackPanel };
    }


    private void btnDoMagic(object sender, RoutedEventArgs e)
    {
        // Get your URI and textbox text here, and use them as arguments below.

        1stMagic.Items.Add(createObject("Sample URI", "Sample Textbox Content"));
    }

当然,它不是特别整洁,并且要求你知道它对应的XAML是什么,只要你修改它,并且一旦你离开事件处理程序就失去了对控件的跟踪(因为它们没有名字或方法直接得到他们),但它应该工作。

如果你想进一步修改创建的对象,你可以遍历1stMagic.Items,或者你可以将创建的控件添加到你在代码中维护的私有内部列表中并以这种方式管理它们。