2013-05-30 17 views
7

Przeszukałem już wiele witryn w Internecie, ale nie znalazłem żadnego rozwiązania. Oświadczenie jest takie, że nie ma różnicy w wydajności między UserControl a CustomControl.Wydajność UserControl/CustomControl

Ale mam następujące klasy Test X, UserControl, CustomControl i 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:

<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> 

MainWindow:

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()); 
    } 
} 

MainWindow Treść:

<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> 

Podczas korzystania z CustomControl, MessageBox pokazuje ok. 20 sekund na moim komputerze, ale podczas korzystania z UserControl zajmuje to około minuty! Wymiana kontrolki za pomocą Grid i TextBox jest nawet szybsza niż CustomControl (~ 16 sekund).

Czy ktoś może zobaczyć, gdzie jest wąskie gardło? Problem pojawia się w mojej aplikacji w świecie rzeczywistym, w której szablon/kontrola byłby znacznie bardziej złożony.

Dzięki dużo,

mikro

Odpowiedz

-1

Jest to późna odpowiedź ale podstawową różnicą jest to, że kontrolny użytkownika jest prawie jak okno, że masz sama kontrola i inne zabezpieczenia, takie jak, Przyciski, siatki, pola tekstowe itp. można do niego dodać. Podstawowa różnica między oknem a sterowaniem użytkownika polega na tym, że kontrola użytkownika może i musi być wyświetlana w oknie.

Kontrola niestandardowa z drugiej strony jest tylko formantem, może być używana do tworzenia kontrolek z określoną funkcjonalnością, dla których nie ma wbudowanych elementów sterujących lub do nadania istniejącego sterowania, takich jak przyciski, pola tekstowe itp. określony styl pasujący do motywu Twojej aplikacji. Możesz również dodać dodatkowe funkcje do istniejących kontrolek, używając niestandardowego elementu sterującego, takiego jak dodanie etykiety do pola tekstowego, aby pokazać jej cel.

Różnica w czasie ładowania jest zasadniczo odzwierciedleniem różnych celów kontroli użytkowników i kontroli osobistych, przy czym w przypadku kontroli użytkownika ładuje się kontrolę i elementy w ramach tej kontroli, aby czas ładowania był dłuższy. Przy sterowaniu niestandardowym tylko sama kontrolka musi zostać załadowana, aby nie ładować się dłużej niż większość wbudowanych elementów sterujących WPF, np. Przycisk Kontrola niestandardowa nie powinna zająć więcej czasu niż wbudowany przycisk sterowania.