wpf - WPF UserControl 的大小调整速度极其缓慢

标签 wpf xaml user-controls resize

我不喜欢在此处粘贴相当长的代码片段,但我对以下 WPF UserControl(本文末尾的 XAML)有问题。提供的代码经过简化,但我测试了它并且它是可重现的。

此 UserControl 的问题是,当添加到 WPF 窗口时,水平调整大小非常慢。更准确地说,当窗口宽度增加时,调整大小的速度与预期一样快。但是,一旦其宽度减小,包含的 UserControl 就会挂起并且调整大小的速度非常慢。在我的电脑上,大约需要 3 秒才能达到最终大小。

我现在的问题: 这是为什么?我能做什么?使用这个简化的控件可能不是一个大问题,但如果两个 ListView 都被填满,操作会更慢。 这是 WPF 本身的问题还是 XAML 中存在错误?我不知道。任何提示/解决方案/解决方法/评论表示赞赏! :-) 谢谢!

<UserControl x:Class="TestApplication.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             d:DesignHeight="768" d:DesignWidth="1280" mc:Ignorable="d">
    <UserControl.Resources>
        <ResourceDictionary>
            <!-- [removed for clarity] -->
        </ResourceDictionary>
    </UserControl.Resources>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="{Binding ElementName='uiCustomerOrderListView', Path='ActualWidth'}" />
            <ColumnDefinition Width="5" />
            <ColumnDefinition Width="{Binding ElementName='uiPackagingOrderListView', Path='ActualWidth'}" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Label
            BorderBrush="Black"
            BorderThickness="1"
            Content="Customer Orders"
            FontWeight="Bold"
            Grid.Column="0"
            Grid.Row="0"
            HorizontalContentAlignment="Center"
            Margin="0,0,0,2"
            SnapsToDevicePixels="True"
            VerticalContentAlignment="Center" />
        <Label
            BorderBrush="Black"
            BorderThickness="1"
            Content="Packaging Orders"
            FontWeight="Bold"
            Grid.Column="2"
            Grid.Row="0"
            HorizontalContentAlignment="Center"
            Margin="0,0,0,2"
            SnapsToDevicePixels="True"
            VerticalContentAlignment="Center" />

        <Grid
            Grid.Column="0"
            Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="4" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="4" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>

            <TextBlock
                x:FieldModifier="private"
                x:Name="uiCustomerOrdersColumn00HeaderTextBlock"
                FontWeight="Bold"
                Grid.Column="1"
                Grid.Row="0"
                Text="[Order No.]"
                TextAlignment="Center"
                TextTrimming="CharacterEllipsis"
                ToolTip="" />
            <!-- [similar TextBlocks for columns 2, 3, 4, 5, 6] -->
            <!-- [removed for clarity] -->
        </Grid>

        <Grid
            Grid.Column="2"
            Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="4" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="4" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>

            <TextBlock
                x:FieldModifier="private"
                x:Name="uiPackagingOrdersColumn00HeaderTextBlock"
                FontWeight="Bold"
                Grid.Column="1"
                Grid.Row="0"
                Text="[Order Nr.]"
                TextAlignment="Center"
                TextTrimming="CharacterEllipsis"
                ToolTip="" />
            <!-- [similar TextBlocks for columns 2, 3, 4, 5, 6, 7] -->
            <!-- [removed for clarity] -->
        </Grid>

        <Border
            BorderBrush="Black"
            BorderThickness="0,2,0,0"
            Grid.Column="0"
            Grid.ColumnSpan="4"
            Grid.Row="2"
            Margin="1,1,1,1"
            SnapsToDevicePixels="True" />

        <ScrollViewer
            Grid.Column="0"
            Grid.ColumnSpan="4"
            Grid.Row="3"
            HorizontalScrollBarVisibility="Disabled"
            VerticalScrollBarVisibility="Visible">

            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="5" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>

                <ListView
                    x:FieldModifier="private"
                    x:Name="uiCustomerOrderListView"
                    Grid.Column="0"
                    Grid.Row="1"
                    ItemsSource="{Binding Path='.'}"
                    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                    ScrollViewer.VerticalScrollBarVisibility="Disabled"
                    SelectionMode="Single"
                    VirtualizingStackPanel.IsVirtualizing="False">
                    <ListView.View>
                        <GridView
                            x:FieldModifier="private"
                            x:Name="uiCustomerOrderGridView"
                            AllowsColumnReorder="False">
                            <GridView.Columns>
                                <GridViewColumn />
                                <GridViewColumn />
                                <GridViewColumn />
                                <GridViewColumn />
                                <GridViewColumn />
                                <GridViewColumn />
                            </GridView.Columns>
                        </GridView>
                    </ListView.View>
                </ListView>

                <ListView
                    x:FieldModifier="private"
                    x:Name="uiPackagingOrderListView"
                    Grid.Column="2"
                    Grid.Row="1"
                    ItemsSource="{Binding Path='.'}"
                    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                    ScrollViewer.VerticalScrollBarVisibility="Disabled"
                    SelectionMode="Single"
                    VirtualizingStackPanel.IsVirtualizing="False">
                    <ListView.View>
                        <GridView
                            x:FieldModifier="private"
                            x:Name="uiPackagingOrderGridView"
                            AllowsColumnReorder="False">
                            <GridView.Columns>
                                <GridViewColumn />
                                <GridViewColumn />
                                <GridViewColumn />
                                <GridViewColumn />
                                <GridViewColumn />
                                <GridViewColumn />
                                <GridViewColumn />
                            </GridView.Columns>
                        </GridView>
                    </ListView.View>
                </ListView>
            </Grid>
        </ScrollViewer>
    </Grid>
</UserControl>

最佳答案

这是因为您将顶部网格(客户订单/包装订单)的宽度绑定(bind)到其他控件的实际宽度,因此当您调整大小时它会经历大量更新。为了在我的测试工具中修复它并保持相同的外观,我执行了以下操作:

将第一个网格的列设置如下:

<Grid.ColumnDefinitions>
     <ColumnDefinition Width="*" />            
     <ColumnDefinition Width="*" />
     <ColumnDefinition Width="18"/>
</Grid.ColumnDefinitions>

然后,我修改了您的第二个标签,将 Grid.Column 属性设置为 1 而不是 2。这为您提供了相同的整体外观。我想说的是,尽管您使用了很多网格,并且可能可以简化此设计一些。这是我的完整代码版本:

<Grid>
     <Grid.ColumnDefinitions>
     <ColumnDefinition Width="*" />            
     <ColumnDefinition Width="*" />
     <ColumnDefinition Width="18"/>
  </Grid.ColumnDefinitions>
     <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
     </Grid.RowDefinitions>

     <Label
        BorderBrush="Black"
        BorderThickness="1"
        Content="Customer Orders"
        FontWeight="Bold"
        Grid.Column="0"
        Grid.Row="0"
        HorizontalContentAlignment="Center"
        Margin="0,0,0,2"
        SnapsToDevicePixels="True"
        VerticalContentAlignment="Center" />
     <Label
        BorderBrush="Black"
        BorderThickness="1"
        Content="Packaging Orders"
        FontWeight="Bold"
        Grid.Column="1"
        Grid.Row="0"
        HorizontalContentAlignment="Center"
        Margin="0,0,0,2"
        SnapsToDevicePixels="True"
        VerticalContentAlignment="Center" />

     <Grid
        Grid.Column="0"
        Grid.Row="1">
        <Grid.ColumnDefinitions>
           <ColumnDefinition Width="4" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="4" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
           <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <TextBlock
            x:FieldModifier="private"
            x:Name="uiCustomerOrdersColumn00HeaderTextBlock"
            FontWeight="Bold"
            Grid.Column="1"
            Grid.Row="0"
            Text="[Order No.]"
            TextAlignment="Center"
            TextTrimming="CharacterEllipsis"
            ToolTip="" />
        <!-- [similar TextBlocks for columns 2, 3, 4, 5, 6] -->
        <!-- [removed for clarity] -->
     </Grid>

     <Grid
        Grid.Column="2"
        Grid.Row="1">
        <Grid.ColumnDefinitions>
           <ColumnDefinition Width="4" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="4" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
           <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <TextBlock
            x:FieldModifier="private"
            x:Name="uiPackagingOrdersColumn00HeaderTextBlock"
            FontWeight="Bold"
            Grid.Column="1"
            Grid.Row="0"
            Text="[Order Nr.]"
            TextAlignment="Center"
            TextTrimming="CharacterEllipsis"
            ToolTip="" />
        <!-- [similar TextBlocks for columns 2, 3, 4, 5, 6, 7] -->
        <!-- [removed for clarity] -->
     </Grid>

     <Border
        BorderBrush="Black"
        BorderThickness="0,2,0,0"
        Grid.Column="0"
        Grid.ColumnSpan="4"
        Grid.Row="2"
        Margin="1,1,1,1"
        SnapsToDevicePixels="True" />

     <ScrollViewer
        Grid.Column="0"
        Grid.ColumnSpan="4"
        Grid.Row="3"
        HorizontalScrollBarVisibility="Disabled"
        VerticalScrollBarVisibility="Visible">

        <Grid>
           <Grid.ColumnDefinitions>
              <ColumnDefinition Width="*" />
              <ColumnDefinition Width="5" />
              <ColumnDefinition Width="*" />
           </Grid.ColumnDefinitions>
           <Grid.RowDefinitions>
              <RowDefinition Height="*" />
           </Grid.RowDefinitions>

           <ListView
                x:FieldModifier="private"
                x:Name="uiCustomerOrderListView"
                Grid.Column="0"
                Grid.Row="1"
                ItemsSource="{Binding Path='.'}"
                ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                ScrollViewer.VerticalScrollBarVisibility="Disabled"
                SelectionMode="Single"
                VirtualizingStackPanel.IsVirtualizing="False">
              <ListView.View>
                 <GridView
                        x:FieldModifier="private"
                        x:Name="uiCustomerOrderGridView"
                        AllowsColumnReorder="False">
                    <GridView.Columns>
                       <GridViewColumn />
                       <GridViewColumn />
                       <GridViewColumn />
                       <GridViewColumn />
                       <GridViewColumn />
                       <GridViewColumn />
                    </GridView.Columns>
                 </GridView>
              </ListView.View>
           </ListView>

           <ListView
                x:FieldModifier="private"
                x:Name="uiPackagingOrderListView"
                Grid.Column="2"
                Grid.Row="1"
                ItemsSource="{Binding Path='.'}"
                ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                ScrollViewer.VerticalScrollBarVisibility="Disabled"
                SelectionMode="Single"
                VirtualizingStackPanel.IsVirtualizing="False">
              <ListView.View>
                 <GridView
                        x:FieldModifier="private"
                        x:Name="uiPackagingOrderGridView"
                        AllowsColumnReorder="False">
                    <GridView.Columns>
                       <GridViewColumn />
                       <GridViewColumn />
                       <GridViewColumn />
                       <GridViewColumn />
                       <GridViewColumn />
                       <GridViewColumn />
                       <GridViewColumn />
                    </GridView.Columns>
                 </GridView>
              </ListView.View>
           </ListView>
        </Grid>
     </ScrollViewer>
  </Grid>

关于wpf - WPF UserControl 的大小调整速度极其缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11848917/

相关文章:

c# - 在 wpf/C# 中绑定(bind)

c# - 命令执行后调用事件

c# - 在另一个 View 模型中执行命令?

c# - 自定义控件属性 - C#、窗体

c# - WPF 用户控件的绑定(bind)问题

wpf - (多个)MultiDataTrigger 与转换器的效率

c# - MVVM 结构。模型类

WPF ComboBox 绑定(bind)未按预期工作

wpf - 在 Xaml 中启用/禁用对 ComboBox 选择的控件

c# - 将自定义 UserControl 添加到 Visual Studio 2005 的工具箱