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

类中存储Control并绑定复用:GridView复用NumberBox抛COM异常

GridView复用NumberBox控件时触发"未检测到已安装组件"异常

我尝试在GridView中复用NumberBox控件,因为直接将NumberBox嵌入GridView的数据模板会引发异常行为,复用则能避免该问题,但现在持续遇到报错:在代码行(templateRoot.FindName("NumberBox") as GridViewItem).Content = item.NumberBox;处抛出**"未检测到已安装组件"**的错误,这段代码位于UpdateGridViewContainer回调方法中:

/// <summary>
/// 更新名为CardGridView的GridView容器的回调方法
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void UpdateGridViewContainer(ListViewBase sender, ContainerContentChangingEventArgs args)
{
    if (args.Phase == 1)
    {
        Grid templateRoot = args.ItemContainer.ContentTemplateRoot as Grid;
        CardItem item = args.Item as CardItem;
        (templateRoot.FindName("NumberBox") as GridViewItem).Content = item.NumberBox;

        TypedEventHandler<NumberBox, NumberBoxValueChangedEventArgs> handler =
            (box, args) =>
            {
                if (!double.IsNaN(args.NewValue))
                {
                    _viewModel.ChangeCount(args, item);
                }
            };

        item.SetHandler(handler);
    }
}

该异常会在包含该GridView的页面离开后重新导航时触发。我尝试在页面离开时清空NumberBox,但问题依然存在,清空代码如下:

/// <summary>
/// 页面重新加载时创建新的NumberBox
/// </summary>
private void ResetNumberBoxes()
{
    foreach (CardItem card in CardGridView.Items.Cast<CardItem>())
    {
        card.ResetNumberBox();
    }
    CardGridView.ItemsSource = null;
    CardGridView.Items.Clear();
}

其中ResetNumberBox方法仅将原有NumberBox设为null,然后重新赋值新实例。

异常详情

System.Runtime.InteropServices.COMException
  HResult=0x800F1000
  Message=No installed components were detected. (0x800F1000)
  Source=WinRT.Runtime
  StackTrace:
   at WinRT.ExceptionHelpers.<ThrowExceptionForHR>g__Throw|20_0(Int32 hr)
   at ABI.Microsoft.UI.Xaml.Controls.IContentControlMethods.set_Content(IObjectReference _obj, Object value)

更新尝试

我已从DataTemplate中移除GridViewItem控件,尝试以下代码,但结果依旧抛出相同异常:

CardItem item = args.Item as CardItem;

Grid.SetColumn(item.NumberBox, 1);
item.NumberBox.HorizontalAlignment = HorizontalAlignment.Center;
item.NumberBox.VerticalAlignment = VerticalAlignment.Center;
(templateRoot.FindName("GridViewTemplate") as Grid).Children.Add(item.NumberBox);

另外,我在抛出异常的代码行前检查了堆转储,确认仅存在一个Grid实例,且NumberBox的Parent属性为null。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:42:50