我有一个用标签组织的WPF应用程序。我在每个tabitem标题中添加了一个小按钮,允许用户关闭标签。
当用户点击小按钮时,我会从tabControl中删除tabItem。
tabControl.Items.Remove(TabItem的);
由于这个tabItem消失了,这很好,但问题出现了:
TabItem不可见(好),但它仍然存在(坏)。如果我把一个计时器放在里面,那么计时器会执行他的Tick,更重要的是,如果我有一个200.000记录的数据网格并关闭了Tab,那么垃圾收集器就不会像我预期的那样释放内存。
我向谷歌询问了这个问题,并且我已经实施了一些描述的建议。它不起作用。
任何人都可以帮助我吗? 感谢
答案 0 :(得分:1)
这是我一直在使用的,据我所知,它从记忆中删除了tabitem。将计时器留在tabitem中的问题是GC不会收集和处理它,因为它检测到计时器仍在使用中。
守则:
namespace Reports.Controls
{
/// <summary>
/// Interaction logic for Test.xaml
/// </summary>
public partial class ReportTab : TabItem
{
public delegate void CloseEvents(ReportTab TabIndex);
public event CloseEvents Closing;
public ReportTab(string Title)
{
InitializeComponent();
tbTitle.Text = Title;
}
private void Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
Closing(this);
}
}
}
xaml:
<TabItem x:Class="Reports.Controls.ReportTab"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Main" Name="tbTitle" Margin="0,0,8,0"/>
<Image Height="13"
Source="pack://application:,,/Images/Icons/close.png"
MouseLeftButtonUp="Image_MouseLeftButtonUp"/>
</StackPanel>
</TabItem.Header>
<Grid>
//Tabitem stuff
</Grid>
</TabItem>
这是带有Tabcontrol的页面,用于添加标签:
void AddTab(string Title)
{
Controls.ReportTab rt = new Controls.ReportTab(Title);
rt.Closing += new Controls.ReportTab.CloseEvents(rt_Closing);
tabControl.SelectedIndex = tabControl.Items.Add(rt);
}
/// <summary>
/// Moves the Tab Control back to the Main tab
/// after a tab is removed
/// </summary>
/// <param name="TabIndex"></param>
void rt_Closing(Controls.ReportTab TabIndex)
{
tabControl.Items.Remove(TabIndex);
//This resets the tabcontrol back to it's first tabindex
tabControl.SelectedIndex = 0;
}
答案 1 :(得分:0)
将用户控件放在选项卡中,并在Usercontrol代码中处理自己的“已卸载”事件。
在那里你应该能够清理。 (除非你的计时器阻止控件卸载,但上次我尝试了类似的工作)。
是的,WPF对所有这些事情都非常危险,如果你不小心你可以很快地控制控制......