2012-03-15 49 views
0

一段時間以來,我已經在下面打破了我的頭。假設我們有這個默認樣式控制:關於模板效率

<Style TargetType="r:PhoneButton"> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="BorderBrush" Value="{StaticResource PhoneForegroundBrush}"/> 
    <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/> 
    <Setter Property="BorderThickness" Value="{StaticResource PhoneBorderThickness}"/> 
    <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilySemiBold}"/> 
    <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMediumLarge}"/> 
    <Setter Property="Padding" Value="10,3,10,5"/> 
    <Setter Property="ActiveMargin" Value="{StaticResource PhoneTouchTargetOverhang}"/> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="r:PhoneButton"> 
      <Grid Background="Transparent"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Margin="{TemplateBinding ActiveMargin}"> 
        <ContentControl ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" Padding="{TemplateBinding Padding}"/> 
       </Border> 
      </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 
</Style> 

上面的模板是有點簡單,但它是用同樣的方式爲標準的按鈕模板。 (事實上​​,我們採取了標準模板和調整了一點)

但是,我不能幫助,但看到一對夫婦的性能問題:

  1. 填充首先被初始化爲0,然後改爲(10,3,10,5)。如果我們從樣式中刪除了setter並使用默認屬性值(10,3,10,5),那麼我們會失去什麼?

  2. BorderBrush的一樣東西。取而代之的是風格二傳手,我們可以使用默認值 (刷)Application.Current.Resources [「PhoneForegroundBrush」]

  3. 上面刷可以由靜態和前景默認重複使用。

  4. 等我們可以擺脫所有的風格制定者。該樣式現在只包含模板定義。但是,即使這可能會被轉移到代碼中。 (我們可以使用方法XamlReader.Load()從字符串中加載模板。)

  5. 使用TemplateBinding確實比標準綁定更快。但是,如果我們在代碼中有模板,那麼對於在我們的類中定義的DependencyProperties(例如ActiveMargin),我們可以選擇完全刪除綁定:我們可以改用PropertyChangedCallback。

如果您認爲我們可以利用上述技術得到的只有花生,那麼這裏就是一個具體的例子: 我有含11個相當複雜的控件形式 - 每一個是2的組成或更簡單的控制。使用上述技術後:

  • 初始形式負載增快25%

  • 隨後形式負載分別爲40%更快。

我測量的是進入頁面構造函數和頁面Loaded事件之間花費的時間。因此測量的時間也包括頁面初始化。 (該頁面包含帶有自定義圖標的標準頁眉和應用欄)。換句話說,真正的表現收益大大高於上述25/40%。

我的問題: 使用上述優化時,您會看到什麼樣的問題?

回答

1

您似乎在消除靈活性(綁定次數和可配置屬性)以及爲每個模板化項目所做的更改次數,以提高性能。

這些變化帶來的靈活性的後果意味着,在未來,如果您需要靈活性,您將沒有那麼大的靈活性。根據應用和您的情況,這可能會或可能不會被接受。 - 如果你正在爲一個應用程序構建一些東西,那麼它不應該是一個問題。 (不要擔心將來可能會出現的小問題。)但是,如果您正在開發一個控制計劃重用,那麼它的靈活性可能很重要。

+0

您能否解釋一下,刪除保證金的風格設置會如何影響靈活性? 在此具體情況下,正在優化的控件是控件庫的一部分。 好的,主應用程序不能修改默認邊距,因爲它不在默認樣式中 - 但是誰會這樣做? 另一方面,用戶stil可以設置控件的樣式並在其中定義合適的邊距。 – 2012-03-15 14:37:35

+0

對不起,我還不夠清楚。我並不是想暗示刪除樣式會影響靈活性。它沒有。但每次重新應用樣式的額外工作都會產生影響。 – 2012-03-15 14:49:17

+0

至於綁定:讓我們採取ActiveMargin。在第一個解決方案中,這個DP綁定到邊界邊界。第二種解決方案使用PropertyChangedCallback處理程序更新相同的邊距。第二種情況下我會鬆動什麼?我認爲用戶stil可以重新模板控件併爲ActiveMargin附加一個新的含義。好吧,我看到了一些風險,但事實上這個ActiveMargin案例並不是綁定移除的最好例子,有很多案例更安全。 – 2012-03-15 14:54:08