UWP代码隐藏中如何正确获取ComboBox控件的项列表
C++/WinRT 获取ComboBox项列表时GetMany返回0的解决方案
问题复现
执行代码前已向ComboBox追加3个项,测试代码如下:
vector <IInspectable> items; int count = DuringCuttingGasTypeComboBox().Items().GetMany(ZERO, items); int size = DuringCuttingGasTypeComboBox().Items().Size();
运行结果:count返回0,items为空向量,但Size()返回值为3,和ComboBox实际项数一致,代码可正常编译无报错。
根因分析
问题出在传入GetMany的目标向量初始容量为0。
C++/WinRT中所有WinRT集合的GetMany方法遵循统一规则:不会自动为调用方传入的目标集合扩容,最多只会写入目标集合当前可容纳的元素数量。声明的空vector<IInspectable>初始可写入元素数为0,因此GetMany不会写入任何元素,直接返回0。Size()方法读取的是源集合本身的长度,和传入的目标缓冲区无关,因此能返回正确的项数3。
修复代码
调用GetMany前先为目标向量分配和集合总长度一致的容量即可:
// 先读取集合总长度 int itemCount = DuringCuttingGasTypeComboBox().Items().Size(); // 预分配对应大小的向量空间 vector<IInspectable> items(itemCount); // 批量读取所有项 int actualCount = DuringCuttingGasTypeComboBox().Items().GetMany(ZERO, items);
执行后actualCount会返回3,items向量内会按顺序存储ComboBox的所有项。
如果不需要一次性批量获取所有项做缓存,直接遍历Items属性即可,无需额外拷贝:
for (auto const& item : DuringCuttingGasTypeComboBox().Items()) { // 编写单条item的处理逻辑 }
内容的提问来源于stack exchange,提问作者kerplatz
相关产品推荐
相关产品推荐

