gpt4 book ai didi

wpf - 性能UserControl/CustomControl

转载 作者:行者123 更新时间:2023-12-04 08:52:36 25 4
gpt4 key购买 nike

我已经在网上搜索了很多站点,但是没有找到任何解决方案。声明是,UserControl和CustomControl之间没有性能差异。

但是我有以下测试类X,UserControl,CustomControl和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>

主窗口:
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内容:
<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时,MessageBox显示大约。在我的计算机上20秒,但是使用UserControl大约需要一分钟!将其网格替换为TextBox控件,它比CustomControl更快(〜16秒)。

有人可以看到瓶颈在哪里吗?这个问题出现在我的实际应用程序中,在该应用程序中,模板/控件要复杂得多。

非常感谢,

最佳答案

这是一个较晚的答案,但是基本的区别在于用户控件几乎就像一个窗口,因为它具有控件本身,然后可以向其中添加其他控件,例如按钮,网格,文本框等。窗口和用户控件之间的基本区别在于,用户控件可以并且必须在窗口内显示。

另一方面,“自定义控件”仅是一个控件,它可以用于创建具有特定功能的控件,而该功能没有内置控件,或者可以为现有控件(例如按钮,文本框等)提供特定样式以进行匹配您的应用程序的主题。您还可以通过使用自定义控件向现有控件添加其他功能,例如在文本框中添加标签以显示其用途。

加载时间的不同本质上反射(reflect)了用户控件和自定义控件的不同目的,使用用户控件可以加载控件和该控件中的元素,因此加载时间可能会更长。使用自定义控件时,只有控件本身必须加载,因此它的加载时间不会比大多数内置WPF控件花费的时间长,即按钮“自定义控件”的加载时间不会比内置按钮控件的时间长。

关于wpf - 性能UserControl/CustomControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16847772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com