Проблемы с закрытием вкладок - PullRequest
1 голос
/ 10 апреля 2009

У меня есть приложение WPF с вкладками. Я добавил маленькую кнопку в каждый заголовок вкладки, которая позволяет пользователю закрывать вкладку.

Когда пользователь нажимает на маленькую кнопку, я удаляю tabItem из вкладки Control.

tabControl.Items.Remove (TabItem);

В результате этого tabItem исчезает, и это нормально, но здесь возникает проблема:

TabItem не виден (хорошо), но он все еще существует (плохо). Если я помещу таймер внутрь, он выполнит свой тик, и, что более важно, если у меня есть сетка данных с 200 000 записей и я закрываю вкладку, сборщик мусора не освобождает память, как я ожидал.

Я спросил Google о проблеме, и я применил некоторые из описанных советов. Это не сработало.

Кто-нибудь может мне помочь? Спасибо

Ответы [ 2 ]

1 голос
/ 10 апреля 2009

Это то, что я использовал, и, насколько я могу судить, удаляет табитем из памяти. Проблема с оставлением таймера внутри таба, заключается в том, что 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;

}
0 голосов
/ 10 апреля 2009

Поместите пользовательский элемент управления на вкладку, а в коде Usercontrol обработайте свое собственное событие «Unloaded».

Там вы должны быть в состоянии очистить. (если только ваш таймер не предотвращает выгрузку элемента управления, но в прошлый раз я попробовал нечто подобное, это сработало).

И да, WPF очень опасен для всех этих вещей, если вы не будете осторожны, вы можете довольно быстро прокачать средства управления ...

...