none
ComboBox 动态创建时怎么设置ItemsPanel RRS feed

  • 问题

  •         <ComboBox Grid.Row="2" Height="23" HorizontalAlignment="Left" Margin="86,78,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" >
                <ComboBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel />
                    </ItemsPanelTemplate>
                </ComboBox.ItemsPanel>
            </ComboBox>
    要是ComboBox 是在.cs里面动态创建出来的 设置它的ItemsPanel是VirtualizingStackPanel
    2012年5月17日 2:11

答案

  • 你好,

    你可以用 FrameworkElementFactory 去构建一个VisualTree给Template:

          ItemsPanelTemplate ipt= new ItemsPanelTemplate();
          FrameworkElementFactory factoryPanel = new FrameworkElementFactory(typeof(VirtualizingStackPanel));
          factoryPanel.SetValue(StackPanel.IsItemsHostProperty, true);
          ipt.VisualTree = factoryPanel;
    
          combobox.ItemsPanel = ipt;

    但是,目前这个方法我们不是很推荐使用,建议还是用下面的反序列化XAML 字符串成ItemPanelTemplate为好:

          string pt = @"<ItemsPanelTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">" +
                        "<VirtualizingStackPanel/>" +
                       "</ItemsPanelTemplate>";
          using (var sr = new MemoryStream(Encoding.UTF8.GetBytes(pt)))
          {
            ItemsPanelTemplate ipt = XamlReader.Load(sr) as ItemsPanelTemplate;
            combobox.ItemsPanel = ipt;
          }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 小携 2012年5月21日 5:51
    2012年5月21日 3:48
    版主

全部回复

  • 你好,

    你可以用 FrameworkElementFactory 去构建一个VisualTree给Template:

          ItemsPanelTemplate ipt= new ItemsPanelTemplate();
          FrameworkElementFactory factoryPanel = new FrameworkElementFactory(typeof(VirtualizingStackPanel));
          factoryPanel.SetValue(StackPanel.IsItemsHostProperty, true);
          ipt.VisualTree = factoryPanel;
    
          combobox.ItemsPanel = ipt;

    但是,目前这个方法我们不是很推荐使用,建议还是用下面的反序列化XAML 字符串成ItemPanelTemplate为好:

          string pt = @"<ItemsPanelTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">" +
                        "<VirtualizingStackPanel/>" +
                       "</ItemsPanelTemplate>";
          using (var sr = new MemoryStream(Encoding.UTF8.GetBytes(pt)))
          {
            ItemsPanelTemplate ipt = XamlReader.Load(sr) as ItemsPanelTemplate;
            combobox.ItemsPanel = ipt;
          }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 小携 2012年5月21日 5:51
    2012年5月21日 3:48
    版主
  • 谢谢...

    2012年5月21日 5:51