You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP开发:如何通过代码为GridView/ListView设置两列?

在UWP中用代码为GridView/ListView设置两列布局

嘿,我来帮你搞定这个问题!在UWP的C++/CX环境里,我们可以通过修改控件的ItemsPanel来实现两列布局,下面分别针对GridView和ListView给出具体实现方案:

一、给GridView设置两列

GridView本身就是为网格布局设计的,默认用ItemsWrapGrid作为布局容器,我们只需要指定它的列数即可。这里提供两种实现方式:

方式1:用FrameworkElementFactory构建布局模板

#include <winrt/Windows.UI.Xaml.Controls.h>
using namespace Windows::UI::Xaml::Controls;

// 创建GridView实例
GridView^ gView = ref new GridView();

// 创建ItemsWrapGrid的工厂对象,设置两列相关属性
FrameworkElementFactory^ wrapGridFactory = ref new FrameworkElementFactory(ItemsWrapGrid::typeid);
// 当Orientation为Vertical时,MaximumRowsOrColumns属性控制列数
wrapGridFactory->SetValue(ItemsWrapGrid::MaximumRowsOrColumnsProperty, 2);
wrapGridFactory->SetValue(ItemsWrapGrid::OrientationProperty, Orientation::Vertical);

// 将工厂对象包装为ItemsPanelTemplate
ItemsPanelTemplate^ panelTemplate = ref new ItemsPanelTemplate();
panelTemplate->VisualTree = wrapGridFactory;

// 给GridView设置布局模板
gView->ItemsPanel = panelTemplate;

方式2:用XamlReader加载XAML字符串(更简洁)

#include <winrt/Windows.UI.Xaml.Markup.h>
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Markup;

GridView^ gView = ref new GridView();

// 定义两列布局的XAML模板字符串
String^ panelXaml = L"<ItemsPanelTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>"
                    L"<ItemsWrapGrid MaximumRowsOrColumns='2' Orientation='Vertical'/>"
                    L"</ItemsPanelTemplate>";

// 加载模板并绑定到GridView
ItemsPanelTemplate^ panelTemplate = dynamic_cast<ItemsPanelTemplate^>(XamlReader::Load(panelXaml));
gView->ItemsPanel = panelTemplate;

二、给ListView设置两列

ListView默认是垂直堆叠的布局(使用StackPanel),要改成两列,需要把它的ItemsPanel替换为ItemsWrapGrid,实现方式和GridView类似:

#include <winrt/Windows.UI.Xaml.Markup.h>
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Markup;

ListView^ lView = ref new ListView();

// 加载两列布局的模板
String^ panelXaml = L"<ItemsPanelTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>"
                    L"<ItemsWrapGrid MaximumRowsOrColumns='2' Orientation='Vertical'/>"
                    L"</ItemsPanelTemplate>";
ItemsPanelTemplate^ panelTemplate = dynamic_cast<ItemsPanelTemplate^>(XamlReader::Load(panelXaml));

// 将模板设置给ListView
lView->ItemsPanel = panelTemplate;

额外补充说明

  • ItemsWrapGrid::MaximumRowsOrColumns的逻辑:当Orientation设为Vertical时,这个值代表列数;如果设为Horizontal,则代表行数。
  • 如果需要固定列宽,可以给ItemsWrapGrid添加ItemWidth属性,比如在XAML字符串里写<ItemsWrapGrid MaximumRowsOrColumns='2' Orientation='Vertical' ItemWidth='200'/>。
  • 记得添加必要的命名空间引用,否则会出现编译报错。

内容的提问来源于stack exchange,提问作者Cobra91151

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:16:39