【问题标题】:more virtualizing stack panel height/slowness issues更多虚拟化堆栈面板高度/速度问题
【发布时间】:2011-06-01 19:21:45
【问题描述】:

我需要一个围绕由项目控件填充的虚拟化堆栈面板的滚动查看器。显然高度是无限的,这就是它不进行虚拟化的原因。为什么?

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <ScrollViewer>
        <ItemsControl ItemsSource="{Binding InterestingHosts}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel IsItemsHost="True" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <TextBlock FontSize="14"><TextBlock Text="{Binding Host.HostName}" FontWeight="Bold" FontSize="18" /> (<TextBlock Text="{Binding Host.IPAddress}" />)</TextBlock>
                        <StackPanel>
                            <StackPanel.Style>
                                <Style TargetType="StackPanel">
                                    <Setter Property="Margin" Value="10" />
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding LoggedOnUsers.Count}" Value="0">
                                            <Setter Property="Visibility" Value="Collapsed" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </StackPanel.Style>
                            <TextBlock Text="The follow domain and/or enterprise admins are logged on to the host: "/>
                            <DataGrid AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding LoggedOnUsers}">
                                <DataGrid.Columns>
                                    <DataGridTextColumn Width="200" Binding="{Binding Domain}" Header="Domain"/>
                                    <DataGridTextColumn Width="200" Binding="{Binding Name}" Header="Username"/>
                                </DataGrid.Columns>
                            </DataGrid>
                        </StackPanel>
                        <StackPanel>
                            <StackPanel.Style>
                                <Style TargetType="StackPanel">
                                    <Setter Property="Margin" Value="10" />
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding Processes.Count}" Value="0">
                                            <Setter Property="Visibility" Value="Collapsed" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </StackPanel.Style>
                            <TextBlock Text="The follow domain and/or enterprise admins are running processes on the host: "/>
                            <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Processes}" IsReadOnly="True">
                                <DataGrid.Columns>
                                    <DataGridTextColumn Width="200" Header="Name" IsReadOnly="False" Binding="{Binding Name}"/>
                                    <DataGridTextColumn Width="200" Binding="{Binding Username}" Header="Username" />
                                    <DataGridTextColumn Binding="{Binding ID}" Header="ID" />
                                </DataGrid.Columns>
                            </DataGrid>
                        </StackPanel>
                        <StackPanel>
                            <StackPanel.Style>
                                <Style TargetType="StackPanel">
                                    <Setter Property="Margin" Value="10" />
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding Services.Count}" Value="0">
                                            <Setter Property="Visibility" Value="Collapsed" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </StackPanel.Style>
                            <TextBlock Text="The follow domain and/or enterprise admins are authenticated for services on the host: "/>
                            <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Services}" IsReadOnly="True">
                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
                                    <DataGridTextColumn Header="Username" Binding="{Binding Username}" />
                                    <DataGridTextColumn Header="Start Mode" Binding="{Binding StartMode}" />
                                    <DataGridTextColumn Header="State" Binding="{Binding State}" />
                                </DataGrid.Columns>
                            </DataGrid>
                        </StackPanel>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>
</Grid>

【问题讨论】:

    标签: wpf


    【解决方案1】:

    看看this answer。使 ItemsControl 虚拟化不仅仅是设置 VirtualizingStackPanel

    基本上,将 ScrollViewer 放在您的 ItemsControl 模板中,围绕您的 ItemsPresenter,并在您的 ItemsControl 上设置 VirtualizingStackPanel.IsVirtualizing="True"ScrollViewer.CanContentScroll="True"

    【讨论】:

      【解决方案2】:

      VirtualizingStackPanel 必须是 ScrollViewer 的直接子级。你可以看到它实现了IScrollInfo,这就是它与父ScrollViewer的联系。

      所以在 ListBox 的情况下,控件模板中已经有一个 ScrollViewer(最终将是 VirtualizingStackPanel 的父级。ItemsControl 的默认 ControlTemplate 没有 ScrollViewer,因此您需要添加它在那里。类似的东西:

      <Style x:Key="{x:Type ItemsControl}"
             TargetType="{x:Type ItemsControl}">
          <Setter Property="Template">
              <Setter.Value>
                  <ControlTemplate TargetType="{x:Type ItemsControl}">
                      <Border Background="{TemplateBinding Background}"
                              BorderBrush="{TemplateBinding BorderBrush}"
                              BorderThickness="{TemplateBinding BorderThickness}"
                              Padding="{TemplateBinding Padding}"
                              SnapsToDevicePixels="true">
                          <ScrollViewer CanContentScroll="True">
                              <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                          </ScrollViewer>
                      </Border>
                  </ControlTemplate>
              </Setter.Value>
          </Setter>
      </Style>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-02
        • 2018-07-16
        • 2011-04-10
        • 2016-01-09
        • 1970-01-01
        • 1970-01-01
        • 2018-01-18
        相关资源
        最近更新 更多