Quantcast
Channel: Windows Presentation Foundation (WPF) forum
Viewing all articles
Browse latest Browse all 18858

Performance UserControl / CustomControl

$
0
0

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>

Viewing all articles
Browse latest Browse all 18858

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>