WPF数据表格中的内存泄漏问题

3

我开发了一个应用程序,其中包含一个数据网格,并且该网格具有不同的列标题和行的上下文菜单。现在对于标题上下文菜单,我已经过滤了数据网格的列。以下是代码片段。

<DataGrid   Padding="3" BorderBrush="SkyBlue" BorderThickness="1"  ItemsSource="{Binding Source={StaticResource cvsCoreData}}"   SelectionUnit="FullRow" IsReadOnly="True"  AutoGenerateColumns="False" x:Name="Data"  Margin="0,5,0,28">
    <DataGrid.Resources>
        <ContextMenu  x:Key="DataGridColumnHeaderContextMenu" >
            <MenuItem Header="ABC" Click="ABC_Click" />
            <MenuItem Header="EFG" Click="EFG_Click" />
            <MenuItem Header="HIJ" Click="HIJ_Click" />
            <MenuItem Header="KLM" Click="KLM_Click" />
        </ContextMenu>
    </DataGrid.Resources>
    <DataGrid.RowStyle>
        <Style TargetType="{x:Type DataGridRow}">
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True" >
                    <Setter Property="Background" Value="SkyBlue" />
                    <Setter Property="Foreground" Value="Black"/>
                </Trigger>
            </Style.Triggers>
            <Setter Property="ContextMenu"
            Value="{StaticResource DataGridColumnHeaderContextMenu}" />
        </Style>
    </DataGrid.RowStyle>
    <DataGrid.Columns>
        <DataGridTemplateColumn SortMemberPath="Key" Width="*" Header="Key ">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock x:Name="block"  TextWrapping="Wrap" Text="{Binding Key}">

                    </TextBlock>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Width="*" Header="Lerm Description" Binding="{Binding KeyDescription}" />
        <DataGridTextColumn Width="*" Header="Short " Binding="{Binding Short}" />
        <DataGridTextColumn Width="*" Header="Rule" Binding="{Binding Rules}" />
    </DataGrid.Columns>
    <DataGrid.ContextMenu>
        <ContextMenu>
            <MenuItem x:Name="ContextKey" IsCheckable="True" IsChecked="True" Header="Key" Unchecked="ContextMenu_Unchecked" Checked="ContextMenu_Checked" Tag="0" />
            <MenuItem x:Name="ContextLermDescription" IsCheckable="True" IsChecked="True" Header="Key" Unchecked="ContextMenu_Unchecked" Checked="ContextMenu_Checked" Tag="1"  />
            <MenuItem x:Name="ContextShor" IsCheckable="True" IsChecked="True" Header="Short" Unchecked="ContextMenu_Unchecked" Checked="ContextMenu_Checked" Tag="2"  />
            <MenuItem x:Name="ContextRule" IsCheckable="True" IsChecked="True" Header="Rules" Unchecked="ContextMenu_Unchecked" Checked="ContextMenu_Checked" Tag="3"  />
        </ContextMenu>
    </DataGrid.ContextMenu>
</DataGrid>  

现在当头部上下文菜单未选中特定列时,该列将被隐藏,反之亦然。这个功能很好用,但当我想要隐藏最后一列时,它需要大约5秒钟,并分配大量内存。当我在数据网格中隐藏所有列后再显示第一列时,同样的情况也会发生。为什么会出现内存泄漏


你使用哪个 .NET Framework?3.5 还是 4.0 或者其他版本? - blindmeis
我正在使用.NET 4.5框架。 - Sowvik Roy
我曾经遇到过与DataGridTemplateColumn类似的问题。(http://wpf.codeplex.com/discussions/400881) 但是这个问题在4.5中已经解决了。 - blindmeis
我已经确定了问题出在哪里。问题出在DataGridRowStyle中,如果我注释掉代码的这一部分,问题就解决了,但我不明白为什么会发生这种情况。我该如何解决这个问题!! - Sowvik Roy
1个回答

5

在处理上下文菜单时,内存泄漏是一个危险 -- 特别是当将其附加到网格时(我以前遇到过类似的问题)。在评论中,您提到将问题隔离到了DataGridRow样式:

<Setter Property="ContextMenu" Value="{StaticResource DataGridColumnHeaderContextMenu}" />

我不确定为什么上述操作会导致内存泄漏,但看起来是一种冒险的做法。您将静态对象(“DataGridColumnHeaderContextMenu”)附加到网格中的每一行,这意味着它无法被处理。只要上下文菜单保留对行的引用并且该行被回收,就会发生泄漏。
在这种情况下(以及一般情况下),我认为您应该使用事件在加载行时附加上下文菜单,并在卸载行时将其移除。对于DataGrid行,这意味着您应该在DataGrid.LoadingRow事件中附加上下文菜单,并在UnloadingRow事件中将其移除。这样可以确保不会发生任何菜单泄漏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接