Your profiler should show you what objects are kept alive, and who is keeping references.
But your screenshot doesn't display any of this.
And why would you need to unhook from events of the same instance?
And why would you set a string to String.Empty in Dispose? What is this supposed to achieve?
I don't see a memory leak on my system (removed the useless Dispose), showing and closing the dialog 100 time.
(at least the Visual Studio Memory Profiler doesn't find an increase in objects after I forced GC)
private void Button_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 100; i++)
{
var window1 = new Window1();
window1.Owner = this;
window1.ShowInTaskbar = false;
window1.ContentRendered += (_, __) => window1.Close();
window1.Show();
}
}