2013-05-30 10 views
7

私は既にネット上の多くのサイトを検索しましたが、解決策は見つかりませんでした。これは、UserControlとCustomControlの間にパフォーマンスの違いはないということです。パフォーマンスUserControl/CustomControl

しかし、私は次のテストクラスX、ユーザーコントロール、CustomControlとメインウィンドウがあります。

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

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

メインウィンドウ:

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> 

CustomControlを使用して、メッセージボックスは約示しています。私のコンピュータでは20秒ですが、UserControlを使用すると約1分かかります!コントロールをグリッドのTextBoxに置き換えると、CustomControl(〜16秒)よりも高速です。

ボトルネックがどこにあるのか誰かが見ることができますか?テンプレート/コントロールがはるかに複雑な私の現実のアプリケーションでは、この問題が発生します。

答えて

-1

これは後半の答えですが、基本的な違いは、ユーザーコントロールはほとんどあなたがコントロール自体など、他のコントロール持つという点で、窓のようなものであるということである

マイクロ

どうもありがとう、ボタン、グリッド、テキストボックスなどを追加することができます。ウィンドウとユーザーコントロールの基本的な違いは、ウィンドウ内にユーザーコントロールを表示する必要があることです。

カスタムコントロールは、単なるコントロールであり、コントロールが組み込まれていない特定の機能を持つコントロールを作成したり、ボタン、テキストボックスなどの既存のコントロールを与えるために使用できます。あなたのアプリケーションのテーマに合ったスタイルを選択できます。テキストボックスにラベルを追加して目的を示すなどのカスタムコントロールを使用して、既存のコントロールに余分な機能を追加することもできます。

負荷の時間の違いは基本的にユーザーコントロールとカスタムコントロールの目的が異なることを反映しています。ユーザーコントロールはコントロールとそのコントロール内の要素を読み込み、読み込み時間が長くなる可能性があります。カスタムコントロールでは、コントロールそのものだけをロードする必要があります。そのため、WPFコントロールに組み込まれているほとんどのボタン、つまりボタンのカスタムコントロールが組み込みのボタンコントロールより長くかかることはありません。