一段時間以來,我已經在下面打破了我的頭。假設我們有這個默認樣式控制:關於模板效率
<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>
上面的模板是有點簡單,但它是用同樣的方式爲標準的按鈕模板。 (事實上,我們採取了標準模板和調整了一點)
但是,我不能幫助,但看到一對夫婦的性能問題:
填充首先被初始化爲0,然後改爲(10,3,10,5)。如果我們從樣式中刪除了setter並使用默認屬性值(10,3,10,5),那麼我們會失去什麼?
BorderBrush的一樣東西。取而代之的是風格二傳手,我們可以使用默認值 (刷)Application.Current.Resources [「PhoneForegroundBrush」]
上面刷可以由靜態和前景默認重複使用。
等我們可以擺脫所有的風格制定者。該樣式現在只包含模板定義。但是,即使這可能會被轉移到代碼中。 (我們可以使用方法XamlReader.Load()從字符串中加載模板。)
使用TemplateBinding確實比標準綁定更快。但是,如果我們在代碼中有模板,那麼對於在我們的類中定義的DependencyProperties(例如ActiveMargin),我們可以選擇完全刪除綁定:我們可以改用PropertyChangedCallback。
如果您認爲我們可以利用上述技術得到的只有花生,那麼這裏就是一個具體的例子: 我有含11個相當複雜的控件形式 - 每一個是2的組成或更簡單的控制。使用上述技術後:
初始形式負載增快25%
隨後形式負載分別爲40%更快。
我測量的是進入頁面構造函數和頁面Loaded事件之間花費的時間。因此測量的時間也包括頁面初始化。 (該頁面包含帶有自定義圖標的標準頁眉和應用欄)。換句話說,真正的表現收益大大高於上述25/40%。
我的問題: 使用上述優化時,您會看到什麼樣的問題?
您能否解釋一下,刪除保證金的風格設置會如何影響靈活性? 在此具體情況下,正在優化的控件是控件庫的一部分。 好的,主應用程序不能修改默認邊距,因爲它不在默認樣式中 - 但是誰會這樣做? 另一方面,用戶stil可以設置控件的樣式並在其中定義合適的邊距。 – 2012-03-15 14:37:35
對不起,我還不夠清楚。我並不是想暗示刪除樣式會影響靈活性。它沒有。但每次重新應用樣式的額外工作都會產生影響。 – 2012-03-15 14:49:17
至於綁定:讓我們採取ActiveMargin。在第一個解決方案中,這個DP綁定到邊界邊界。第二種解決方案使用PropertyChangedCallback處理程序更新相同的邊距。第二種情況下我會鬆動什麼?我認爲用戶stil可以重新模板控件併爲ActiveMargin附加一個新的含義。好吧,我看到了一些風險,但事實上這個ActiveMargin案例並不是綁定移除的最好例子,有很多案例更安全。 – 2012-03-15 14:54:08