2013-05-30 34 views
7

Tôi đã tìm kiếm rất nhiều trang web trên mạng, nhưng không tìm thấy bất kỳ giải pháp nào. Tuyên bố là, rằng không có sự khác biệt về hiệu suất giữa UserControl và CustomControl.Hiệu suất UserControl/CustomControl

Nhưng tôi có những điều sau lớp thử nghiệm X, UserControl, CustomControl và 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 Nội dung:

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

Khi sử dụng CustomControl, MessageBox cho thấy khoảng. 20 giây trên máy tính của tôi, nhưng khi sử dụng UserControl, nó mất khoảng một phút! Thay thế điều khiển bằng Grid của nó một TextBox, nó thậm chí còn nhanh hơn so với CustomControl (~ 16 giây).

Ai đó có thể thấy nút cổ chai ở đâu? Vấn đề nảy sinh trong ứng dụng thực tế của tôi, nơi mà Template/Control sẽ phức tạp hơn nhiều.

Thanks a lot,

vi

Trả lời

-1

Đây là một câu trả lời cuối nhưng sự khác biệt cơ bản là một điều gần như là giống như một cửa sổ trong đó bạn có sự kiểm soát bản thân và điều khiển thì khác như thế nào, nút, lưới, hộp văn bản, v.v. có thể được thêm vào nó. Sự khác biệt cơ bản giữa một cửa sổ và điều khiển người dùng là điều khiển người dùng có thể và phải được hiển thị trong một cửa sổ. Một điều khiển tùy chỉnh mặt khác chỉ là một điều khiển, nó có thể được sử dụng để tạo ra một điều khiển với một chức năng cụ thể mà không có kiểm soát được xây dựng hoặc để cung cấp cho một điều khiển hiện có, như nút, hộp văn bản, vv phong cách cụ thể để phù hợp với chủ đề của ứng dụng của bạn. Bạn cũng có thể thêm vào các tính năng bổ sung cho các điều khiển hiện có bằng cách sử dụng điều khiển tùy chỉnh chẳng hạn như thêm nhãn vào hộp văn bản để hiển thị mục đích của nó.

Sự khác biệt về thời gian tải về cơ bản là sự phản ánh của các mục đích khác nhau của Điều khiển người dùng và tùy chỉnh, với Điều khiển người dùng nó tải điều khiển và các yếu tố trong điều khiển đó để thời gian tải có thể lâu hơn. Với một Custom Control chỉ kiểm soát chính nó phải tải vì vậy nó sẽ không mất nhiều thời gian để tải hơn được xây dựng trong điều khiển WPF tức là một nút Custom Control không nên mất nhiều thời gian hơn một nút điều khiển được xây dựng trong.