新聞中心
開發(fā)人員在使用WPF做圖形界面的時(shí)候,通常都希望能有一個(gè)高效的利用率。在這里我們就為大家介紹一下有關(guān)WPF性能優(yōu)化的幾種方法。#t#

創(chuàng)新互聯(lián)從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元惠民做網(wǎng)站,已為上家服務(wù),為惠民各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
WPF性能優(yōu)化一、Rendering Tier
1. 根據(jù)硬件配置的不同,WPF采用不同的Rendering Tier做渲染。下列情況請(qǐng)?zhí)貏e注意,因?yàn)樵谶@些情況下,即使是處于Rendering Tier 2的情況下也不會(huì)硬件加速。(不全,其余請(qǐng)查閱SDK)
Bitmap effects, Printed content, Tiled content that uses TileBrush, Layered windows.
下列情況為L(zhǎng)ayered window: 1. WindowStyle = none, 2.AllowsTransparency = true, 3.Background = Transparent.
WPF性能優(yōu)化二、布局和設(shè)計(jì)
1.盡量多使用Canvas等簡(jiǎn)單的布局元素,少使用Grid或者StackPanel等復(fù)雜的,越復(fù)雜性能開銷越大。
2.建立邏輯樹或者視覺樹的時(shí)候,遵循Top-Down的原則。示例代碼如下:
- C#
- private void OnBuildTreeTopDown
(object sender, RoutedEventArgs e) - {
- TextBlock textBlock = new TextBlock();
- textBlock.Text = "Default";
- DockPanel parentPanel = new DockPanel();
- DockPanel childPanel;
- myCanvas.Children.Add(parentPanel);
- myCanvas.Children.Add(textBlock);
- for (int i = 0; i < 150; i++)
- {
- textBlock = new TextBlock();
- textBlock.Text = "Default";
- parentPanel.Children.Add(textBlock);
- childPanel = new DockPanel();
- parentPanel.Children.Add(childPanel);
- parentPanel = childPanel;
- }
- }
WPF性能優(yōu)化三、圖像
1. 對(duì)Image做動(dòng)畫處理的時(shí)候(如調(diào)整大小等),可以使用這條語句RenderOptions.SetBitmapScalingMode(MyImage,BitmapScalingMode.LowQuality),以改善性能。
2. 用TileBrush的時(shí)候,可以CachingHint。
WPF性能優(yōu)化四、對(duì)象行為
1.訪問CLR對(duì)象和CLR屬性的效率會(huì)比訪問DependencyObject/DependencyProperty高。注意這里指的是訪問,不要和前面的綁定混淆了。但是,把屬性注冊(cè)為DependencyProperty會(huì)有很多的優(yōu)點(diǎn):比如繼承、數(shù)據(jù)綁定和Style。所以有時(shí)候我們可以在實(shí)現(xiàn)DependencyProperty的時(shí)候,利用緩存機(jī)制來加速訪問速度:看下面的緩存例子:
- public static readonly Dependency
Property MagicStringProperty =- DependencyProperty.Register(
"MagicString", typeof(string),
typeof(MyButton), new PropertyMetadata
(new PropertyInvalidatedCallback
(OnMagicStringPropertyInvalidated),
new GetValueOverride(MagicStringGet
ValueCallback)));- private static void OnMagicString
PropertyInvalidated(DependencyObject d)- {
- // 將緩存的數(shù)據(jù)標(biāo)識(shí)為無效
- ((MyButton)d)._magicStringValid = false;
- }
- private static object MagicString
GetValueCallback(DependencyObject d)- {
- // 調(diào)用緩存的訪問器來獲取值
- return ((MyButton)d).MagicString;
- }
- // 私有的CLR訪問器和本地緩存
- public string MagicString
- {
- get
- {
- // 在當(dāng)前值無效時(shí),獲取***的值保存起來
- if (!_magicStringValid)
- {
- _magicString = (string)GetValueBase
(MagicStringProperty);- _magicStringValid = true;
- }
- return _magicString;
- }
- set
- {
- SetValue(MagicStringProperty, value);
- }
- }
- private string _magicString;
- private bool _magicStringValid;
另外,因?yàn)樽?cè)的DependencyProperty在默認(rèn)是不可繼承的,如果需要繼承特性,也會(huì)降低DependencyProperty值刷新的效率。注冊(cè)DependencyProperty屬性時(shí),應(yīng)該把DefaultValue傳遞給Register方法的參數(shù)來實(shí)現(xiàn)默認(rèn)值的設(shè)置,而不是在構(gòu)造函數(shù)中設(shè)置。
WPF性能優(yōu)化五、應(yīng)用程序資源
1. 在自定義控件,盡量不要在控件的ResourceDictionary定義資源,而應(yīng)該放在Window或者Application級(jí)。因?yàn)榉旁诳丶袝?huì)使每個(gè)實(shí)例都保留一份資源的拷貝。
2. 盡量使用Static Resources,但不能盲目使用。
WPF性能優(yōu)化六、文本
1. 文字少的時(shí)候用TextBlock或者label,長(zhǎng)的時(shí)候用FlowDocument.
2. 使用元素TextFlow和TextBlock時(shí),如果不需要TextFlow的某些特性,就應(yīng)該考慮使用TextBlock,因?yàn)樗男矢摺?/p>
3. 在TextFlow中使用UIElement(比如TextBlock)所需的代價(jià)要比使用TextElement(比如Run)的代價(jià)高.在FlowDocument中盡量避免使用TextBlock,要用Run替代。代碼如下:
- < FlowDocument>
- < !-- Text content within
a Run (more efficient). -->- < Paragraph>
- < Run>Line one< /Run>
- < /Paragraph>
- < !-- Text content within
a TextBlock (less
efficient). -->- < Paragraph>
- < TextBlock>Line two
< /TextBlock>- < /Paragraph>
- < /FlowDocument>
4. 在TextBlock中顯式的使用Run命令比不使用Run命名的代碼要高。
- < !-- Run is used to set
text properties. -->- < TextBlock>
- < Run FontWeight="Bold">
Hello, world< /Run>- < /TextBlock>
- < !-- TextBlock is used
to set text properties,
which is more efficient. -->- < TextBlock FontWeight=
"Bold">- Hello, world
- < /TextBlock>
5. 把Label(標(biāo)簽)元素的ContentProperty和一個(gè)字符串(String)綁定的效率要比把字符串和TextBlock的Text屬性綁定的效率低。因?yàn)長(zhǎng)abel在更新字符串是會(huì)丟棄原來的字符串,全部重新顯示內(nèi)容。如果字符串不需要更新,用Label就無所謂性能問題。
6. 在TextBlock塊使用HyperLinks時(shí),把多個(gè)HyperLinks組合在一起效率會(huì)更高。
- < !-- Hyperlinks in separate
TextBlocks. -->- < TextBlock>
- < Hyperlink TextDecorations=
"None" NavigateUri="http:
//www.msn.com">MSN Home
< /Hyperlink>- < /TextBlock>
- < TextBlock Text=" | "/>
- < TextBlock>
- < Hyperlink TextDecorations=
"None" NavigateUri="http:
//my.msn.com">My MSN< /Hyperlink>- < /TextBlock>
- < !-- Hyperlinks combined
in the same TextBlock. -->- < TextBlock>
- < Hyperlink TextDecorations=
"None" NavigateUri="http:
//www.msn.com">MSN Home< /Hyperlink>- < Run Text=" | " />
- < Hyperlink TextDecorations=
"None" NavigateUri="http:
//my.msn.com">My MSN< /Hyperlink>- < /TextBlock>
7. 顯示超鏈接的時(shí)候,盡量只在IsMouseOver為True的時(shí)候顯示下劃線,一直顯示下劃線的代碼高很多
8. 盡量不使用不必要的字符串連接。
WPF性能優(yōu)化七、數(shù)據(jù)綁定
1.在使用數(shù)據(jù)綁定的過程中,如果綁定的數(shù)據(jù)源是一個(gè)CLR對(duì)象,屬性也是一個(gè)CLR屬性,那么在綁定的時(shí)候?qū)ο驝LR對(duì)象所實(shí)現(xiàn)的機(jī)制不同,綁定的效率也不同。
A、數(shù)據(jù)源是一個(gè)CLR對(duì)象,屬性也是一個(gè)CLR屬性。對(duì)象通過TypeDescriptor/PropertyChanged模式實(shí)現(xiàn)通知功能。此時(shí)綁定引擎用TypeDescriptor來反射源對(duì)象。效率***。
B、數(shù)據(jù)源是一個(gè)CLR對(duì)象,屬性也是一個(gè)CLR屬性。對(duì)象通過INotifyPropertyChanged實(shí)現(xiàn)通知功能。此時(shí)綁定引擎直接反射源對(duì)象。效率稍微提高。
C、數(shù)據(jù)源是一個(gè)DependencyObject,而且屬性是一個(gè)DependencyProperty。此時(shí)不需要反射,直接綁定。效率***。
2.當(dāng)一個(gè)CLR對(duì)象很大時(shí),比如有1000個(gè)屬性時(shí),盡量把這個(gè)對(duì)象分解成很多很小的CLR對(duì)象。比如分成1000個(gè)只有一個(gè)屬性的CLR對(duì)象。
3. 當(dāng)我們?cè)诹斜恚ū热鏛istBox)顯示了一個(gè)CLR對(duì)象列表(比如List)時(shí),如果想在修改List對(duì)象后,ListBox也動(dòng)態(tài)的反映這種變化。此時(shí),我們應(yīng)該使用動(dòng)態(tài)的ObservableCollection對(duì)象綁定。而不是直接的更新ItemSource。兩者的區(qū)別在于直接更新ItemSource會(huì)使WPF拋棄ListBox已有的所有數(shù)據(jù),然后全部重新從List加載。而使用ObservableCollection可以避免這種先全部刪除再重載的過程,效率更高。
4. 盡量綁定IList而不是IEnumerable到ItemsControl。
WPF性能優(yōu)化八、其它性能建議
1. 如果需要修改元素的Opacity屬性,***修改一個(gè)Brush的屬性,然后用這個(gè)Brush來填充元素。因?yàn)橹苯有薷脑氐腛pacity會(huì)迫使系統(tǒng)創(chuàng)建一個(gè)臨時(shí)的Surface
2. 用NavigationWindow的時(shí)候,盡量Update the client area by object,而不是URI
3. 盡量不要使用ScrollBarVisibility=Auto
當(dāng)前標(biāo)題:WPF性能優(yōu)化經(jīng)驗(yàn)總結(jié)
分享鏈接:http://m.fisionsoft.com.cn/article/ccdpcpo.html


咨詢
建站咨詢
