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
相关产品推荐
相关产品推荐

