代码之家  ›  专栏  ›  技术社区  ›  Jonathan

关闭选项卡时出现问题

  •  1
  • Jonathan  · 技术社区  · 15 年前

    我有一个WPF应用程序,有标签。我在每个tabitem头部添加了一个小按钮,允许用户关闭该选项卡。

    当用户单击小按钮时,我将从TabControl中移除TabItem。

    tabControl.items.remove(tabItem);

    因此,tabitem会取消模仿,这很好,但问题是:

    TabItem不可见(好),但仍存在(坏)。如果我把一个计时器放进去,计时器就会执行它的勾选,更重要的是,如果我有一个数据报,有200000条记录,我关闭标签,垃圾收集器不会像我预期的那样释放内存。

    我向谷歌询问了这个问题,并实施了一些所描述的建议。它不起作用。

    有人能帮我吗? 谢谢

    2 回复  |  直到 15 年前
        1
  •  1
  •   Noah    15 年前

    这是我一直在使用的,据我所知,它从内存中删除了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;
    
    }
    
        2
  •  0
  •   Denis Troller    15 年前

    在选项卡中放置一个用户控件,在用户控件代码中处理它自己的“unloaded”事件。

    在那里你应该能清理干净。(除非您的计时器阻止控件卸载,但上次我尝试类似的操作时,它起作用了)。

    是的,WPF对所有这些东西都是非常危险的,如果你不小心的话,你可以很快地控制出血…