【问题标题】:Memory leak issue in WPF datagridWPF 数据网格中的内存泄漏问题
【发布时间】:2014-10-20 19:19:49
【问题描述】:

我开发了一个应用程序,它有一个数据网格,它有不同的列标题和行上下文菜单。现在对于标题上下文菜单,我已经过滤了数据网格列。代码sn-p如下。

<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 框架? 3.5 或 4.0 或 ...
  • 我正在使用 .NET 4.5 框架。
  • 好吧,DataGridTemplateColumn 也有类似的问题。 (wpf.codeplex.com/discussions/400881) 但这已经用 4.5 解决了
  • 我已经确定了问题所在。问题出在DataGridRowStyle,如果我注释掉问题解决的那部分代码,但我不明白为什么会这样。我该如何解决这个问题!

标签: c# wpf xaml memory-leaks datagrid


【解决方案1】:

在使用上下文菜单时,内存泄漏是一种危险——尤其是在将它们附加到网格时(我过去也遇到过类似的问题)。在您提到的 cmets 中,您将问题隔离到 DataGridRow 样式:

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

我不知道上述原因导致内存泄漏的确切原因,但它看起来确实是一件冒险的事情。您将静态对象(“DataGridColumnHeaderContextMenu”)——意味着它不能被释放——附加到网格中的每一行。泄漏所需要的只是上下文菜单保存对该行的引用,并回收该行。

无论如何,我认为在这种情况下(通常在这种情况下)你应该做的是使用事件在行加载时附加上下文菜单,并在它卸载时将其分离。对于 DataGrid 行,这意味着您应该在 DataGrid.LoadingRow 事件中附加上下文菜单,并在 UnloadingRow 事件中将其删除。这应该确保不会发生菜单泄漏。

【讨论】:

    猜你喜欢
    • 2016-02-07
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多