wpf - Performance UserControl/CustomControl
user-controls custom-controls (1)
Ya busqué muchos sitios en la red, pero no encontré ninguna solución. La afirmación es que no hay diferencia de rendimiento entre UserControl y CustomControl.
Pero tengo la siguiente clase de prueba X, UserControl, CustomControl y 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));
}
}
}
Control de usuario:
<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">
<Grid Name="root" Background="LightGray">
<TextBlock Text="{Binding Title}" />
</Grid>
</UserControl>
CustomControl:
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)));
}
}
Xaml:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:DisplayControl}">
<Grid Background="white">
<TextBlock Text="{TemplateBinding Title}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Ventana principal:
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());
}
}
Contenido de MainWindow:
<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>
Al usar CustomControl, MessageBox muestra aprox. 20 Segundos en mi computadora, pero cuando usa el UserControl, ¡demora alrededor de un minuto! Reemplazando el Control con su Cuadrícula y TextBox, es incluso más rápido que CustomControl (~ 16 seg).
¿Alguien puede ver dónde está el cuello de botella? El problema surge en mi aplicación en el mundo real, donde la Plantilla / Control sería mucho más compleja.
Muchas gracias,
micro
Esta es una respuesta tardía, pero la diferencia básica es que un Control de usuario es casi como una ventana en la que usted tiene el control en sí y luego se le pueden agregar otros controles como botones, cuadrículas, cuadros de texto, etc. La diferencia básica entre una ventana y el Control de usuario es que el Control de usuario puede y debe mostrarse dentro de una ventana.
Un control personalizado, por otro lado, es solo un control, se puede usar para crear un control con una funcionalidad específica para la que no hay controles incorporados o para darle a un control existente, como botones, cuadros de texto, etc., un estilo específico para que coincida el tema de tu aplicación. También puede agregar características adicionales a los controles existentes mediante el uso de un control personalizado, como agregar una etiqueta a un cuadro de texto para mostrar su propósito.
La diferencia en el tiempo de carga es esencialmente un reflejo de los diferentes propósitos del Usuario y los Controles Personalizados, con un Control de Usuario carga el control y los elementos dentro de ese control para que el tiempo de carga sea más largo. Con un control personalizado solo el control debe cargarse para que no tarde más en cargarse que la mayoría de los controles WPF incorporados, es decir, un botón de control personalizado no debería tomar más tiempo que un control de botón incorporado.