2013-05-30 21 views
7

Zaten ağda birçok site aradım, ancak herhangi bir çözüm bulamadım. Açıklama, bir UserControl ve CustomControl arasında bir performans farkı yoktur.Performans UserControl/CustomControl

Ama var aşağıdaki test sınıfı X UserControl, CustomControl ve 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 İçerik:

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

CustomControl kullanarak MessageBox yakl gösterir. Bilgisayarımda 20 saniye, ancak UserControl kullanırken, yaklaşık bir dakika sürer! Kontrolü bir Grid ile bir TextBox ile değiştirerek, CustomControl'den (~ 16 sn) daha hızlıdır.

Birisi darboğazın nerede olduğunu görebilir mi? Sorun, Şablon/Kontrol'ün çok daha karmaşık olacağı gerçek dünyadaki uygulamasında yükseliyor.

cevap

-1

Bu geç bir cevaptır ama temel fark, bir Kullanıcı Kontrol neredeyse kontrol kendisi ve benzeri daha sonra diğer denetimleri vardır bunda bir pencere gibi olmasıdır

mikro

Çok teşekkürler, Düğmeler, ızgaralar, metin kutuları vb. eklenebilir. Bir pencere ile Kullanıcı Kontrolü arasındaki temel fark, Kullanıcı Kontrolünün bir pencere içinde görüntülenebilmesi ve görüntülenebilmesidir.

Diğer taraftan, bir Özel Denetim yalnızca bir denetimdir, denetimlerde yerleşik olmayan veya düğmeler, metin kutuları, vb. Gibi varolan bir denetimi veren belirli bir işlevle bir denetim oluşturmak için kullanılabilir. uygulamanızın temasını eşleştirmek için belirli bir stil. Ayrıca böyle bu amaca göstermek için bir metin kutusuna bir etiket ekleme gibi bir özel denetim kullanarak mevcut kontroller ile ekstra özellikler ekleyebilirsiniz.

yükleme zaman farkı esasen kontrol ve kumanda içindeki öğeleri yükleme süresi daha uzun olabilir, böylece yük, bir kullanıcı denetimi ile kullanıcı ve özel denetimleri farklı amaçlar bir yansımasıdır. Özel bir Denetimi sadece kontrolüyle kendisi en yani bir düğme Özel Kontrol düğmesi kontrolünde inşa daha uzun sürmemelidir denetimlerini WPF inşa daha yüklemek için herhangi bir uzun sürmez öylesine yüklemek gerekir.