Skip to content
十月 12, 2009 / wychi

WPF RoutedCommand cause performance issue.

最近遇到了一個WPF RotuedCommand造成的performance的問題

當得知根本原因是RoutedCommand造成時,真的是出乎我的想像

沒想到一個小小的動作會付出這麼大的代價

我寫了一個 test app來重置這個問題, 可以在這裡下載(PerfTest1 please rename .DOC to .ZIP)

問題是這樣發生的….

很單純的宣告一個ListBox.ItemTemplate如下

   1:  <DataTemplate>
   2:      <Border Background="AliceBlue" Width="100">
   3:          <Button Command="{Binding Cmd}" Content="{Binding DisplayName}"/>
   4:      </Border>
   5:  </DataTemplate>

然後產生2000個objects放到ListBox (UI virtualizing is disabled in my case),

根據DataTemplate, Listbox會自動展開2000個ListBoxItem,然後將Cmd bind到Button.Command

為了正確的UI顯示, WPF 會去呼叫RoutedCommand.CanExecute()來確認button的狀況.

就這樣, 只要接下來的操作WPF認為需要去確認button的狀態(Ex:切換listbox的selection),都會去呼叫CanExecute(),

如此造成的結果就是app的response time 變慢, objects的數量愈多, 情況愈糟

我的解法是將RoutecCommand 改成一個實作ICommand的class.  簡單有效

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: