gpt4 book ai didi

c# - WPF 数据网格中的内存泄漏问题

转载 作者:行者123 更新时间:2023-11-30 14:55:20 24 4
gpt4 key购买 nike

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

<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 秒并且它分配了大量内存。当我在隐藏数据网格中的所有列后使第一列可见时,也会发生同样的事情。为什么会发生这种内存泄漏

最佳答案

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

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

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

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

关于c# - WPF 数据网格中的内存泄漏问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25523212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com