Silverlight控件InitializeComponent冻结应用程序

时间:2011-07-06 08:14:22

标签: multithreading silverlight

我有一个控件,我在应用程序中创建了数百次。 我注意到我的应用程序冻结,因为在Initializecomponent函数中, 有 System.Windows.Application.LoadComponent(this,new System.Uri(“/ fa; component / Controls / Common / Popup / PopupItem.xaml”,System.UriKind.Relative));

如果我发表评论,应用程序运行顺畅(当然没有控制渲染)。

如何避免/提高性能,以便每次都不会加载XAML,但不知怎的回收控件?

for (int i = 5; i < colValues.Count; i++)
            {
                if (colValues[i].Count == "1")
                    continue;

                PopupItem pi = new PopupItem(colValues[i], false, this, FilterCategorySearch.PopupContent);
                FilterCategorySearch.PopupContent.spItemsContainer.Children.Add(pi);
            }

和XAML是

<UserControl x:Class="FacetedSearch.Controls.Common.Popup.PopupItem"
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"
xmlns:local="clr-namespace:FacetedSearch.Controls.Common"
mc:Ignorable="d">
<UserControl.Resources>
    <SolidColorBrush x:Key="TextNormalBrush" Color="#FF656565"/>
    <SolidColorBrush x:Key="TextHoverBrush" Color="#FFA39F9F"/>
</UserControl.Resources>

<StackPanel MouseEnter="LayoutRoot_MouseEnter" MouseLeave="LayoutRoot_MouseLeave" Orientation="Horizontal" Margin="0,4,0,0">
    <local:CTLCheckBox x:Name="cbFilter" MouseLeftButtonUp="cbFilter_MouseLeftButtonUp" Cursor="Hand" Height="14" Width="10" Margin="4,0" />
    <TextBlock x:Name="tbFilterName"  Foreground="{StaticResource TextNormalBrush}" MouseLeftButtonUp="tbFilterName_MouseLeftButtonUp" TextWrapping="Wrap" FontFamily="Arial" Margin="0,0,4,0" Cursor="Hand"/>
    <TextBlock x:Name="tbFilterCount" TextWrapping="Wrap"  Foreground="{StaticResource TextNormalBrush}" FontFamily="Arial"/>
</StackPanel>

感谢

1 个答案:

答案 0 :(得分:2)

用户控件的xaml由Silverlight针对UserControl的每个新实例进行解析。这意味着如果添加100个相同UserControl的实例,则xaml将被读取,解析,实例化为对象,然后是可视对象100次。 你有两种可能性:

  1. 通过从DataTemplate(通过ContentControl使用)中引用来从其他位置访问您的UserControl
  2. 将您的UserControl重写为“真正的”控件(即Control或ContentControl的子类)