2012-02-13 5 views
3

申し訳ありませんが、この質問は単純すぎますが、コントロールの背景を作成する方法を考え出すのは難しいです。アプリのパフォーマンスが向上することを期待しています。スキニングコントロールのバックグラウンド - より良いパフォーマンス?

私は9種類のコントロールを持っています。それらのすべてには背景があります。背景は、画像、その他のコントロール、またはその両方で構成されています。これらの背景には別の背景があります。

このようなパワーポイントは、スライド、スライドレイアウト、およびスライドマスターがこの順番で継承されています。私は9つのスライド/コントロールを持っています。

  • 最初の3つのコントロールは、同じ "コントロールレイアウト" を持っている(のが ControlLayout1それを呼びましょう)。 ControlLayout1は、その一部をControlMaster1から取得します。
  • 2番目の3つのコントロールも同じコントロールレイアウトですが、最初のコントロールとは異なる です。それを ControlLayout2としましょう。また はControlMaster1から継承しています。
  • 3つのコントロールの最後のセットが再び異なります。私たちは電話することができます ControlLayout3。しかし今度は、彼らは別のマスターから継承する - ControlMaster2

現在、各コントロールでは、毎回すべてのXAMLを個別に書き出しています。私はこれらの各項目のそれぞれにこれらを書かない方法がなければならないと考えています。理想的には、私が作成したいのは、再利用できるXAMLのセットです。

ここではいくつかの擬似XAMLです:

​​

そしてどこかControlLayouts ため(私は知らない、Application.Resourcesなど、または他の場所)

<Canvas x:Name="ControlLayout1"> 
    <MyMasterBackground (ControlMaster1)/> 
</Canvas> 

<Canvas x:Name="ControlLayout2"> 
    <MyMasterBackground (ControlMaster1)/> 
    <TextBox Text="The Control 2"> 
</Canvas> 

<Canvas x:Name="ControlLayout3"> 
    <MyMasterBackground (ControlMaster2)/> 
    <TextBox Text="The Control 3"> 
</Canvas> 

そしてについてコントロールマスター

<Canvas x:Name="ControlMaster1"> 
    <Canvas.Background> 
     <ImageBrush ImageSource="/Images/image1.jpg" /> 
    </Canvas.Background> 
</Canvas> 

<Canvas x:Name="ControlMaster2"> 
    <Canvas.Background> 
     <ImageBrush ImageSource="/Images/image2.jpg" /> 
    </Canvas.Background> 
    <TextBox Text="Control Master 1"> 
</Canvas> 

ControlLayoutsとControlMasterは一度定義すると決して変更する必要はなく、静的です。

これらをすべて1つの場所に配置してXAMLを再利用することができれば、もっと小さなXAPを持つだけでなく、ControlLayoutsが自動的にBitmapCachedなどを取得するため、アプリケーションでパフォーマンスが向上することを期待しています。

まず、上記を実装するための良い戦略がありますか(ControlLayoutsとマスターにはコードビハインドはありません)。第2に、Control1、Control2などの読み込みでパフォーマンスが向上しますか?最後に、純粋なユーザーコントロール(つまり、コードが残っている)の場合は、それがパフォーマンス向上につながりますか?

ありがとうございます!

+0

静的なものをBitmapCachedにするには、手動で設定する必要があります。特定のものは[自動キャッシュされた](http://msdn.microsoft.com/en-us/library/ff602285(v=v9.aspx).aspx)ですが、私の経験では手動で設定すると大きな違いが生じますが、特に、UI要素をたくさん移動して不気味なパフォーマンスを見ているときは特にそうです。 –

答えて

1

何を頼むことはいくつかの組み合わせです:背景の事について

:ちょうどユーザーコントロールの背後にあるコードでタイプブラシの依存関係プロパティを(MyBackgroundDPのは、それを呼びましょう)を作成し、それをバインドしますあなたのXAMLは次のように:propdp
は単に二回「propdp」とそのTABを書く:

<UserControl ...> 
    <Grid Background={"Binding MyBackgroundDP, RelativeSource={RelativeSource Mode=FindAncestor, AncestoryType=UserControl}}"> 
    <!-- More XAML declarations --> 
    </Grid> 
</UserControl> 

は、依存関係プロパティを作成するには、Visual Studioでのスニペットに建て使用することができます。フィールドを埋めて、それはすべて良いです。

さて、十分に簡単でしたよね? ;)

ここで、より厳しい部分は、いわゆるマスターページを作成することです。
実際、それはバックグラウンドのものとあまり違いはありません。
もう1つの依存関係プロパティを宣言します。これはオブジェクトのこの時刻のみ、またはFrameworkElement(より良い)です。

次に、XAMLでは、一種のプレースホルダー(ContentControl)を宣言します。のは、この例ではMyContentDPそれを呼ぶことにしましょう:

<UserControl ...> 
    <Grid Background={"Binding MyBackgroundDP, RelativeSource={RelativeSource Mode=FindAncestor, AncestoryType=UserControl}}"> 
    <ContentControl ContentTemplate="{Binding MyContentDP, RelativeSource={RelativeSource Mode=FindAncestor, AncestoryType=UserControl}}" /> 
    </Grid> 
</UserControl> 

あなたは、あなたは、この「マスタービュー」で提供したい任意の他の微調整は、グリッドの周囲に境界線を追加するいくつかの花を置くことができ、あなたはそれに名前を付けます。

あなたはそれがパフォーマンスポイントMyUserControl

<Window ... 
     xmlns:local="...reference_to_your_usercontrol_dll/exe"> 
    <Grid> 
     <local:MyUserControl MyBackgroundDP="Red"> 
     <local:MyUserControl.MyContentDP> 
      <!-- More XAML declarations here --> 
     </local:MyUserControl.MyContentDP> 
     </local:MyUserControl> 
    </Grid> 
</Window> 

と呼ばれていたと仮定すると、これはあなたがそれを使用する方法で、完了したら:あなたはカスタムコントロールとして、このために、すべてのXAMLを配置した場合

(UserControlのDIFFERENT)、すべてのXAMLをApp.xamlに入れることができます
なぜですか? XAMLの解析は集中的な操作になる可能性があります。また、必要に応じて実行時にWP7/SLを解析すると、パフォーマンスが低下します。
代わりに、App.xamlは起動時に解析され、メモリに格納されます。これがアプリケーションの読み込み時に行われる処理です。 XAMLの数が少ないコントロールではパフォーマンスは向上しますが、パフォーマンスは向上しますが、これはまだ有効な方法です。

希望します。

Bab。

関連する問題