You could use
WPF Performance Suite
Optimizing WPF Application Performance
A similar issue haunts me.. (something like)
At application startup I query the database and retrieve all employees and related information to be shown in the ListBox. This is kept in memory the entire time.
May be you could modify your code to follow WPF: Data Virtualization
I've noticed that there are some issues in WPF and .NET 3.5 SP1 w.r.t memory issues in seemingly innocuous situations.
I did find a couple of resources, but I'm not sure they would be helpful to you:
http://blog.ramondeklein.nl/?p=58
That blog post describes a situation whereupon when
- A style is defined in the application’s ResourceDictionary.
- The style uses a control template that uses media effects (i.e. DropShadowEffect).
- The media effect should be referenced using a StaticResource
In a nutshell, I think your solution would be to ensure that any media effects (dropshadow, etc) use static resources.
It really seems to be memory leaking. Probably, some of the UI elements in the DataTemplate keep references to other objects that should stay alive even when the UI element is destroyed.
There could be some memory leaks with Image control. Try removing it from the template and see the result. Also, are you subscribing to any events in controls' Loaded events or something like that?
Just some guesses though... As people already said here you might really want to look at your app with performance and memory profilers.
At the risk of being glib, you have a memory leak. Why not try a tool like ANTS* to track it down. They have a free trial, I've never used it but it has a good reputation.
*Other profiling tools are available.
If you don't want to get to grips with another tool, you can try something like incrementing a static member every time a class is created and decrementing it every time an instance is disposed. This will help you track down instances that are not be destroyed properly.
One thing that helped me a lot was to use a class wrapping the Stream class. This is explained in detail here and sure enough I saved a lot of memory by using this method. WPF really keeps the reference to the underlying byte[] and stream for each picture.