2012-02-13 51 views
3

對不起,如果這個問題過於簡單,但我很難弄清楚如何創建背景來控制 - 希望能夠提高應用性能。皮膚控制背景 - 更好的性能?

我有9個不同的控件。他們都有背景。背景由圖像,其他控件或兩者組成。所有這些背景都有另一個背景。

想想像Powerpoint這樣的幻燈片,幻燈片佈局和幻燈片母版 - 按此順序繼承。我有9張幻燈片/控件。

  • 第3個控制具有相同的 「控制佈局」(姑且稱之爲 ControlLayout1)。 ControlLayout1ControlMaster1獲取它的一些元素。
  • 第二個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> 

再來說ControlMasters

<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永遠不需要改變 - 它們是靜態的。

除了只有一個較小的XAP,如果我可以將這些全部放在一個位置並重用XAML,我希望在我的應用程序中提高性能,因爲ControlLayouts會自動獲取BitmapCached或類似的東西。所以首先,是否有一個很好的策略來實現上述(ControlLayouts和Masters沒有任何代碼隱藏)?其次,在加載Control1,Control2等時性能會得到改善?最後,如果它們是純粹的usercontrols(即它們有一些代碼),那對性能會更好嗎?

在此先感謝!

+0

如果你想讓靜態的東西成爲BitmapCached,你應該手動設置它。某些東西是[自動緩存](http://msdn.microsoft.com/en-us/library/ff602285(v = vs.95).aspx),但根據我的經驗手動設置它可以產生很大的差異,尤其是當您將UI元素轉移到很多地方並看到生澀的表現時。 – 2012-02-23 04:45:40

回答

1

什麼你問的是幾件事情的組合:

關於背景的東西:只是在用戶控件的代碼後面創建類型刷的依賴屬性(我們稱之爲MyBackgroundDP),並將其綁定你的XAML,如:

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

要創建依賴屬性,你可以使用內置的片段在Visual Studio:propdp
簡單地寫上「propdp」和TAB鍵兩次。填寫字段,這是很好的。

好吧,這很容易,對嗎? ;)

現在更難的部分:製作所謂的母版頁。
其實它和背景沒什麼不同。
聲明另一個依賴項屬性,僅此類型對象或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此爲自定義控制(這是DIFFERENT from UserControl),那麼你可以把所有的XAML放到你的App.xaml中
爲什麼?因爲解析XAML可能是一項密集型操作,並且如果您在需要時使WP7/SL在運行時解析它,則會失去性能。
相反,你的App.xaml在啓動時被解析,然後它在內存中。這就是加載你的應用程序的過程。你會得到性能提升,儘管對於由少量XAML組成的控件而言它是最小的,但這仍然是一個好習慣。

希望這會有所幫助,

Bab。