C# 如何让Listbox以编程方式在代码中水平显示?

C# 如何让Listbox以编程方式在代码中水平显示?,c#,wpf,C#,Wpf,我搜索了又搜索,看到的都是XAML示例。我想在没有XAML的情况下通过编程实现这一点。代码如下: StackPanel stackPanel = new StackPanel(); stackPanel.Orientation = Orientation.Horizontal; lstBox.Items.Add(stackPanel); mainGrid.Children.Add(lstBox);` 这不起作用,因为列表保持垂直。

我搜索了又搜索,看到的都是XAML示例。我想在没有XAML的情况下通过编程实现这一点。代码如下:

        StackPanel stackPanel = new StackPanel();
        stackPanel.Orientation = Orientation.Horizontal;
        lstBox.Items.Add(stackPanel);
        mainGrid.Children.Add(lstBox);`

这不起作用,因为列表保持垂直。我尝试将列表框设置为StackPanel和其他组合的子项,但未成功。

如果希望列表框中的元素水平显示,应设置其ItemsPanel属性:

FrameworkElementFactory stackPanel = new FrameworkElementFactory(typeof(StackPanel));
stackPanel.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
lstBox.ItemsPanel = new ItemsPanelTemplate(stackPanel);
mainGrid.Children.Add(lstBox);

如果希望列表框中的元素水平显示,则应设置其ItemsPanel属性:

FrameworkElementFactory stackPanel = new FrameworkElementFactory(typeof(StackPanel));
stackPanel.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
lstBox.ItemsPanel = new ItemsPanelTemplate(stackPanel);
mainGrid.Children.Add(lstBox);

也可以通过以下方式将“项目”面板设置为水平:

var wp = new FrameworkElementFactory(typeof(WrapPanel));
wp.SetValue(Panel.IsItemsHostProperty, true);
lstBox.ItemsPanel = new ItemsPanelTemplate(wp);         
mainGrid.Children.Add(lstBox);

WrapPanel可用于将工具栏控件中的按钮等项目放在一起。

也可以通过以下方式将“项目”面板设置为水平:

var wp = new FrameworkElementFactory(typeof(WrapPanel));
wp.SetValue(Panel.IsItemsHostProperty, true);
lstBox.ItemsPanel = new ItemsPanelTemplate(wp);         
mainGrid.Children.Add(lstBox);

WrapPanel可用于将工具栏控件中的按钮等项保持在一起。

对于水平面板,最好使用WrapPanel以利用WrapPanel元素的优点。 这是新年的一个例子-

XAML


对于水平面板,最好使用包装件来利用包装件的优点。 这是新年的一个例子-

XAML


谢谢@mm8。然而,编译的代码因未经处理的异常而崩溃System.InvalidOperationException:“ItemsPanelTemplate的VisualTree必须包含一个面板。它不是一个面板。”调用app.Run时。@schöěxěŕ只有在已添加列表框的情况下才会轰炸应用程序。然而,如果是这样的话,那么case JW将收到一个与他不同的错误。@mm8编译错误,它不是编译错误,而是运行时错误。@JW:它应该是new FrameworkElementFactorytypeofStackPanel。您缺少类型。请重新阅读我的答案。您不应该将类型传递给ItemsPanelTemplate构造函数。你应该给它一个FrameworkElementFactory。谢谢@mm8。然而,编译的代码因未经处理的异常而崩溃System.InvalidOperationException:“ItemsPanelTemplate的VisualTree必须包含一个面板。它不是一个面板。”调用app.Run时。@schöěxěŕ只有在已添加列表框的情况下才会轰炸应用程序。然而,如果是这样的话,那么case JW将收到一个与他不同的错误。@mm8编译错误,它不是编译错误,而是运行时错误。@JW:它应该是new FrameworkElementFactorytypeofStackPanel。您缺少类型。请重新阅读我的答案。您不应该将类型传递给ItemsPanelTemplate构造函数。你应该给它一个FrameworkElementFactory。