I've made a list of everything that can helps to improve performance in a very complex application with a lot of controls. If you want to add yours, your welcome!
- If you know the size of the control, remove the Auto and enter the real value, so the parent doesn't have to parse all childs to check the size he needs
- Set the parameter IsHitTestVisible=False if the element doesn't need to be interactive
- Freeze all object that you can
- Use Static resources instead of Dynamic resources
- Don't use the Ellipse object, transform the Ellipse to a Path
- Don't use TextBox or Label if you can use a TextBlock
- Use Canvas instead of Grid when possible
- No FlowDocument
- Virtualize!! VirtualizingStackPanel instead of StackPanel
- Don't use List, the ObservableCollection is way faster
- Use the Drawing library, it's faster then the Shapes library
- Check your binding! If a binding doesn't works, it can be very slow
- Don't use Visibility.Hidden, use Visibility.Collapsed when you can
- DependencyProperty is 3x faster then INotifyPropertyChanged
- StreamGeometry is faster then PathGeometry
- Clear Event Handlers when you've done with them!
- Don't use the Object Opacity property, if you can, use his color opacity
- Check if your application is Hardware rendering (Tier-2)
- Reduce size/quality of your image when you can
- Rendering image is way faster then rendering vector!
Tools that I use:
- WPF Inspector
- Snoop
- WPFPerf suite
- Visual Studio profiler
- CLR Profiler for .NET