Hi @ all,
I already have searched a lot of sites on the net, but didn't find any solution. The statement is, that there is no performance difference between a UserControl and a CustomControl.
But I have the following test class X, UserControl, CustomControl and MainWindow:
public class X : INotifyPropertyChanged { private string _title; public string Title { get { return _title; } set { if (value == _title) { return; } _title = value; OnPropertyChanged("Title"); } } public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged(string propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } }
<UserControl x:Class="controlperformance.DisplayView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="300" d:DesignWidth="300" mc:Ignorable="d"><Grid Name="root" Background="LightGray"><TextBlock Text="{Binding Title}" /></Grid>
</UserControl>
public class DisplayControl : Control { #region Title public string Title { get { return (string)GetValue(TitleProperty); } set { SetValue(TitleProperty, value); } } public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(DisplayControl), new PropertyMetadata(default(string))); #endregion static DisplayControl() { DefaultStyleKeyProperty.OverrideMetadata(typeof(DisplayControl), new FrameworkPropertyMetadata(typeof(DisplayControl))); } }
<Style TargetType="{x:Type local:DisplayControl}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type local:DisplayControl}"><Grid Background="white"><TextBlock Text="{TemplateBinding Title}" /></Grid></ControlTemplate></Setter.Value></Setter></Style>
public partial class MainWindow : Window { Stopwatch sw = new Stopwatch(); public MainWindow() { InitializeComponent(); Loaded += OnLoaded; sw.Start(); ObservableCollection<X> list = new ObservableCollection<X>(); Random r = new Random(); for (int i = 0; i < 50000; i++) { list.Add(new X { Title = r.Next().ToString()}); } itemscontrol.ItemsSource = list; } private void OnLoaded(object sender, RoutedEventArgs routedEventArgs) { sw.Stop(); MessageBox.Show(sw.Elapsed.ToString()); } }
<ItemsControl Name="itemscontrol"><ItemsControl.ItemTemplate><!--<DataTemplate DataType="{x:Type Controlperformance:X}"><Controlperformance:DisplayView DataContext="{Binding}" /></DataTemplate>--><DataTemplate DataType="{x:Type Controlperformance:X}"><Controlperformance:DisplayControl Title="{Binding Title}"/></DataTemplate></ItemsControl.ItemTemplate></ItemsControl>
When using the CustomControl, the MessageBox shows approx. 20 Seconds on my computer, but when using the UserControl, it takes about a minute! Replacing the Control with its Grid an TextBox, it is even faster than the CustomControl (~16 sec).
Can someone see where the bottleneck is? The problem raises in my real-world application, where the Template/Control would be much more complex.
Thanks a lot,
micro
<style>FB_Addon_TelNo{ height:15px !important; white-space: nowrap !important; background-color: #0ff0ff;}</style>