Удалить элемент управления из родительского элемента UserControl в WPF

Я уже посмотрел в StackOverflow, и на самый близкий мне вопрос был дан ответ 7 лет назад, и моя проблема не решилась.

MainControl.Children.Remove(ChildControl);

это удаляет ChildControl из списка дочерних элементов, но если я проверю память с помощью диагностических инструментов VS (а именно вкладки «Использование памяти»), я вижу, что объект все еще создается. Я думал, что GC позаботится об этом, но если я продолжу использовать приложение, количество экземпляров ChildControl, которые предположительно были удалены, не уменьшится.

Обновлено: я пишу отрывок из кода, который вызывает у меня эту проблему.

public partial class MainWindow : Window 
{
    public ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    // user control
    MainGridUserControl mainGrid;
    SelectionProcess selProcess;

    ProcessManagerViewModel ProcessManagerContext;

    /// <summary>
    /// Switch main grid and selection process. True active main grid, false active selection process
    /// </summary>
    /// <param name = "openClose"></param>
    public void SwitchMainGridSelectionProcess(bool openClose)
    {
        InfoLoginViewModel ilvm = (InfoLoginViewModel)SimpleIoc.Default.GetInstance<IInfoLoginViewModel>();
        InfoLogin infoLogin = ilvm.ActualInfoLogin;

        // if openClose true close selection process user control and open main grid user control
        // else close main grid user contorllo and return to selection process user control
        if (openClose)
        {
            MainWindowGrid.Children.Remove(selProcess);
            SelectionProcessViewModel spvm = (SelectionProcessViewModel)selProcess.DataContext;
            spvm.CloseCommand.Execute(null);
            selProcess = null;

            mainGrid = new MainGridUserControl(mwvm.LayoutMainGridTop, mwvm.ShowStationTree);
            Grid.SetRow(mainGrid, MAINGRID_ROW);
            if (this.FindName("MainWindowGrid") is null)
                this.RegisterName("MainWindowGrid", mainGrid);

            MainWindowGrid.Children.Add(mainGrid);

            mwvm.SetOpenProcessToggleButtonCommand.Execute(null);

            // set permission process user
            mwvm.SetEnableButtonCommand.Execute(infoLogin.ProcessUser);
        }
        else
        {
            // if maiGrid null the open process failed. The old selProcess is already present
            if (mainGrid != null)
            {
                if (!(this.FindName("MainWindowGrid") is null))
                    this.UnregisterName("MainWindowGrid");
                MainWindowGrid.Children.Remove(mainGrid); // snapshot diagnostic tool shows this line has no effect on the number of instances of 'mainGrid'
                mainGrid = null;

                selProcess = new SelectionProcess();
                Grid.SetRow(selProcess, MAINGRID_ROW);

                MainWindowGrid.Children.Add(selProcess);

                // set permission application user
                mwvm.SetEnableButtonCommand.Execute(infoLogin.ApplicationUser);
            }
        }
    }
}

Вы можете предоставить нам Минимальный, полный и проверяемый пример?

V.Leon 13.05.2018 14:49

@HenkHolterman Я должен сам написать метод удаления? Это не из тех, что предлагает intellisense.

Faby 13.05.2018 15:10

@ V.Leon К сожалению, нет, я хотел бы проверить, является ли метод удаления (как ХенкХолтерман) заданием, а окна памяти просто не подходящим инструментом для использования в этом случае. Обновлено: Я понял, что не полностью ответил на ваш вопрос. Я не могу привести пример, так как кроме того, что я уже описал, ничего больше нет, это просто строка кода, которая, похоже, работает не так, как я предполагал.

Faby 13.05.2018 15:12

Попробуйте GC.Collect (), если вы действительно хотите собрать всю память, как только объекты будут удалены, а это не так.

Shivani Katukota 13.05.2018 15:15

@ShivaniKatukota - нет, не звоните GC.Collect(). Так началось слишком много проблем.

Henk Holterman 13.05.2018 15:15

@HenkHolterman, только если абсолютно необходимо освободить память, занятую этими удаленными объектами.

Shivani Katukota 13.05.2018 15:18

Честно говоря, я чувствовал, что это было бы излишеством, более того, это должен быть лучший способ решить такую ​​простую задачу ... Я ошибаюсь, предполагая, что количество экземпляров должно уменьшиться, если я удалю childControl и перезапишу ссылку, указывающую на него?

Faby 13.05.2018 15:30

@FabianoGaeta Да, элементы управления должны иметь право на сборку мусора, если не осталось ссылок. Могли бы предоставить пример кода? Я подозреваю, что что-то еще ссылается на элементы управления. Также не должно быть необходимости звонить в Dispose или GC.Collect().

V.Leon 13.05.2018 19:45

Кроме того, создание снимка памяти с помощью средств профилирования / диагностики производительности вызовет сборку мусора (профилирование памяти / кучи основано на событиях, вызванных сборщиком мусора), поэтому нет необходимости делать это вручную.

V.Leon 13.05.2018 19:55

@ V.Leon Я отредактировал свой вопрос кодом, с которым у меня возникли проблемы. Надеюсь, этого будет достаточно.

Faby 13.05.2018 22:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
237
0

Другие вопросы по теме