.NET Memory Profiler - отличный инструмент, который я часто использую для диагностики утечек памяти в приложениях WPF.
Как я уверен, вы знаете, что хороший способ его использования - сделать снимок перед использованием определенной функции, затем сделать второй снимок после его использования, закрыть окно и т. Д. При сравнении двух снимков можно увидеть, сколько объектов определенного типа выделено, но не освобождено: это утечка.
После двойного щелчка по типу, профилировщик покажет вам кратчайшие корневые пути, сохраняющие объекты этого типа живыми. Существует множество различных способов утечки объектов .NET в WPF, поэтому публикация корневого пути, который вы видите, должна помочь определить окончательную причину. В целом, однако, попытайтесь понять, почему эти объекты удерживаются на вашем объекте, и посмотрите, есть ли какой-нибудь способ отсоединить ваши обработчики событий, привязки и т. Д., Когда окно закрыто.
Недавно я опубликовал запись в блоге о конкретной утечке памяти , которая может быть вызвана определенными привязками; для этого конкретного типа утечки код там полезен для нахождения Binding, который виноват.