2011-07-06 7 views
1

アプリケーション中に何百回も作成するコントロールがあります。 Initializecomponent関数で があるため、 System.Windows.Application.LoadComponent(this、new System.Uri( "/ fa; component/Controls/Common/Popup/PopupItem.xaml"、 System.UriKind.Relative));SilverlightコントロールInitializeComponentはアプリケーションをフリーズします

私がこれをコメントアウトすると、アプリケーションはスムーズに実行されます(もちろんコントロールはレンダリングされません)。

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> 

おかげ

+0

頻繁に再利用しているポップアップの内容を説明できますか?単一の共有コントロールの「必要に応じて挿入する」方が適切な場合に、Xamlにインラインで配置する傾向があります。 –

+0

私は自分の質問を編集しました – Himberjack

+0

あなたのコントロールについてもう少し詳しく説明してください。あなたがアプリケーションの中であなたのコントロールを何百回も作成していると言うと、xamlに何百回も使用するUserControlという意味ですか?または、実行時にユーザーにメッセージを表示するために使用するMessageBox/ChildWindowタイプのコントロールですか? –

答えて

2
ユーザーコントロールのためのXAMLは、ユーザーコントロールのすべての新しいインスタンス用のSilverlightによって解析される

です。これは、同じUserControlの100個のインスタンスを追加すると、xamlが読み込まれ、解析され、オブジェクトとしてインスタンス化され、次にビジュアルオブジェクトが100回インスタンス化されることを意味します。 (

  1. アクセス
  2. は「本当の」コントロールをするユーザーコントロールを書き換え
  3. (ContentControlに、たとえば、によって使用される)のDataTemplate内からそれを参照することにより、別の場所からあなたのUserControl: あなたは2つの可能性を持っていますつまり、ControlまたはContentControlのサブクラス)
関連する問題