【问题标题】:uwp combobox ContainerfromIndex(0) always returns nulluwp 组合框 ContainerfromIndex(0) 始终返回 null
【发布时间】:2021-03-13 07:17:23
【问题描述】:

我想在没有选择任何项目时选择组合框的第一项,但它不适用于 ContainerFromIndex(0) 或 ContainerFromItem。

我不确定为什么它不会像这样工作,因为如果在组合框中选择了一个项目,索引方法可以正常工作,那么为什么在没有选择项目时它不能工作,因为项目仍然存在。我什至可以轻松地从代码中的项目列表中获取第一项。基本上我想要第一个“ComboBoxItem”。

  if (comboBox.SelectedIndex == -1)
        {
            //var allItems = comboBox.Items.ToList();
            //var cccc = comboBox.Items.Count;
            //var firstItem = allItems.First();
            var ci = comboBox.ContainerFromIndex(0) as ComboBoxItem;
            if (ci != null)
            {
                ci.StartBringIntoView();
            }
        }

更新

我还尝试了使用 Task.Delay(100) 的以下代码 bcz 项目应该是延迟加载的,但仍然将 ci 设为 null,奇怪的是 comboBox.Items 显示所有项目,并且comboBox.ItemSource 显示项目的所有计数,但 ContainerFromItem 仍返回 null。

  await Task.Delay(100);
  var comboBox = (ComboBox) sender;
  if (comboBox.SelectedIndex == -1)
  {                
       var ci = comboBox.Items[0];
       var cc = comboBox.ContainerFromItem(ci) as ComboBoxItem;
       if (cc != null)
       {
            cc.StartBringIntoView();
       }
  }

【问题讨论】:

    标签: c# xaml uwp combobox frameworks


    【解决方案1】:

    uwp 组合框 ContainerfromIndex(0) 总是返回 null

    请勾选Combobox style,listview部分放在popup控件中,表示listview会延迟加载。如果你不打开下拉菜单。 listview 部分将不会呈现。您可以选择一项然后调用 ContainerFromIndex 方法来验证这一点。如果你想给它Combobox 的默认选择项,请给SelectedIndex 值,如下所示。

    <ComboBox
        x:Name="CBX"
        Width="200"
        Header="Colors"
        PlaceholderText="Pick a color"
        SelectedIndex="0"
        SelectionChanged="ColorComboBox_SelectionChanged">
        <x:String>Blue</x:String>
        <x:String>Green</x:String>
        <x:String>Red</x:String>
        <x:String>Yellow</x:String>
    </ComboBox>
    

    【讨论】:

    • 目标是打开下拉列表并在未选择任何项目时将其滚动到顶部项目并在选择项目时将其滚动到选定项目,我在问题中的代码实际上在“ dropdown_opened" 方法,当一个项目已被选中时,我总是得到该项目,只有当 selectedIndex = -1 时为空。但无论如何,我通过在样式中的滚动查看器上放置一个行为并在加载事件时滚动到顶部找到了解决方法。无论如何,谢谢。
    • 是的,您还可以在 dropdown_opened 事件中添加任务延迟,请参考此案例reply
    • 不幸的是,我自己的工作也很不一致,并不总是有效。
    • 你有没有试过在得到这样的项目之前添加任务延迟case
    • 是的,我尝试了 Task.Delay() 它仍然不起作用。,
    猜你喜欢
    • 2018-12-10
    • 2018-02-16
    • 2023-03-11
    • 1970-01-01
    • 2021-07-22
    • 2016-05-31
    • 2015-08-15
    • 2012-03-18
    • 2016-11-04
    相关资源
    最近更新 更多