Как автоматизировать очистку всплывающей подсказки в UserControl - PullRequest
5 голосов
/ 22 ноября 2011

Я выследил утечку памяти и сузил ее до всплывающей подсказки, которая размещена в классе, производном от UserControl.

Всплывающая подсказка размещается в выделенном конструкторе элемента управления и инициализируется в событии Load следующим образом:

public class CommonProfile : System.Windows.Forms.UserControl
{
    private ToolTip toolTip1;

    ...

    public CommonProfile()
    {
        InitializeComponent();

        // Create the ToolTip and associate with the Form container.
        toolTip1 = new ToolTip(this.components);
    }

    private void CommonProfile_Load(object sender, System.EventArgs e)
    {
        // Set up the delays for the ToolTip.
        toolTip1.AutoPopDelay = 5000;
        toolTip1.InitialDelay = 1000;
        toolTip1.ReshowDelay = 500;
        // Force the ToolTip text to be displayed whether or not the form is active.
        toolTip1.ShowAlways = true;

        // Set up the ToolTip text
        toolTip1.SetToolTip(this.btnDeleteEntry, "Delete this Profile");
        toolTip1.SetToolTip(this.lblProfileType, "Edit this Profile");
        toolTip1.SetToolTip(this.lblProfileData, "Edit this Profile");
        toolTip1.SetToolTip(this.picFlagForUpdate, "Toggle Flag for Update");
    }    
}

Срок действия родительского элемента управления превышает срок его существования. Этот элемент управления создается «на лету» и добавляется к элементу управления панели, а затем впоследствии удаляется из элемента управления панели.

Я обнаружил, что элемент Dispose элемента управления не вызывается, по-видимому, потому что ссылки на всплывающую подсказку остаются.

Я добавил метод выключения следующим образом:

public void Shutdown()
{
    toolTip1.RemoveAll();
}

Вызов метода Shutdown устраняет утечку, и в конечном итоге вызывается утилизация.

К сожалению, это решение требует, чтобы тот, кто использует элемент управления, не забывал вызывать метод Shutdown по окончании работы с ним.

Я хотел бы знать, есть ли какой-нибудь способ, которым я могу автоматизировать это так, чтобы это происходило без явного вызова метода Shutdown.

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011

Вы не показываете код того, как вы выбрасываете UserControl из вашего Panel.

Просто звоните:

panel1.Controls.Remove(userControl1);

не собирается распоряжатьсяUserControl.

Вам нужно специально позвонить:

userControl1.Dispose();

, что также автоматически удалит его из Panel.В вашем UserControl, если вам нужно провести собственную очистку, попробуйте подписаться на его собственное событие Dispose:

private ToolTip toolTip1;

public UserControl1() {
  InitializeComponent();
  // tooltip initialization
  this.Disposed += UserControl1_Disposed;
}

private void UserControl1_Disposed(object sender, EventArgs e) {
  if (toolTip1 != null)
    toolTip1.Dispose();
}
1 голос
/ 22 ноября 2011

Также в вашем методе управления dispose вам нужно явно вызвать dispose для вашей подсказки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...