2011-08-09 2 views
0

私はCaliburn Micro & Fluent Ribbonを.NET 4.0ベースのWPFアプリケーションで使用しています。私の問題は、ビュー間の変更が遅すぎるということです。私はこの問題の根本を知っていると思います。ビュー間の切り替えが遅い(ビューには多くのアイテムが含まれているDataGridが含まれています)

しかし、私は解決する方法はありません。まず、私のアプリのデザインについて説明します。

シェルはWPFウィンドウで、Fluent Ribbon.MenuにはRibbonTabItemアイテムが含まれています。ユーザーがシェルのタブ項目をクリックすると、新しいビューが読み込まれます。ここで

は、ビューのXAMLです:

<StackPanel Grid.Row="0"> 
     <Fluent:Ribbon> 
      <Fluent:Ribbon.Menu> 

       <Fluent:Backstage> 
        <Fluent:BackstageTabControl> 
         <Fluent:BackstageTabItem Header="Open"/> 
         <Fluent:BackstageTabItem Header="Close"/> 
        </Fluent:BackstageTabControl> 
       </Fluent:Backstage> 

      </Fluent:Ribbon.Menu> 

      <!--Tabs--> 
      <Fluent:RibbonTabItem Micro:Message.Attach="[PreviewMouseLeftButtonDown]=[Action ShowView1()]"/> 
    <Fluent:RibbonTabItem Micro:Message.Attach="[PreviewMouseLeftButtonDown]=[Action ShowView2()]"/> 
    <Fluent:RibbonTabItem Micro:Message.Attach="[PreviewMouseLeftButtonDown]=[Action ShowViewN()]"/> 

     </Fluent:Ribbon> 

    </StackPanel> 

    <Grid Grid.Row="1"> 
     <ContentControl x:Name="ActiveItem" /> 
    </Grid> 
</Grid> 

ShellViewモデルクラス:

namespace T_TOOL.ViewModels 
{ 

    public interface IShellViewModel{} 

    [Export(typeof(IShellViewModel))] 
    public class ShellViewModel :Conductor<IScreen>.Collection.OneActive, 
     IShellViewModel, 
     IPartImportsSatisfiedNotification 
    { 

     public void ShowView1() 
     { 
      var screen = IoC.Get<IShowView1(); 
      ActivateItem(screen); 
     } 

     public void ShowView2() 
     { 
      var screen = IoC.Get<IShowView2(); 
      ActivateItem(screen); 
     } 

//... 
     public void ShowViewN() 
     { 
      var screen = IoC.Get<IShowViewN(); 
      ActivateItem(screen); 
     } 

    } 
} 

ViewModel1、ViewModel2、... ViewModelNは唯一のDataGridコントロールが含まれています。 Datagridコントロールでは、ICollectionViewのプロパティタイプをビューモデルからバインドします。

このプロパティには18,000 - 25,000件のアイテムが含まれています。私はこれが問題の根源だと思うのですが、なぜViews間の変更が遅いのですか?私は拡張WPFツールキットからDataGridコントロールを使用します。

DataGridのEnableRowVirtualizationプロパティとEnableColumnVirtualizationプロパティをtrueに設定しました。しかし、それは助けにはならない。 ViewModel1クラスから

<Style x:Key="MainView_CallsDataGrid" TargetType="{x:Type Controls:DataGrid}" 
      BasedOn="{StaticResource MainView_FontBaseStyle}"> 
     <Setter Property="AutoGenerateColumns" Value="False"/> 
     <Setter Property="VerticalScrollBarVisibility" Value="Visible"/> 
     <Setter Property="HorizontalScrollBarVisibility" Value="Visible"/> 
     <Setter Property="VerticalAlignment" Value="Stretch"/> 
     <Setter Property="HorizontalAlignment" Value="Stretch"/> 
     <Setter Property="Margin" Value="4,15,4,15"/> 
     <Setter Property="EnableRowVirtualization" Value="True"/> 
     <Setter Property= "EnableColumnVirtualization" Value="True"/> 
    </Style> 

コード:ここで

はViewModel1のビューXAMLコードである

 public ICollectionView CallsView 
     { 
      get 
      { 
       return _callsView; 
      } 
      set 
      { 
       _callsView = value; 
       NotifyOfPropertyChange(() => CallsView); 
      } 
     } 

//... Init CallsView property from List<T> property 

     CallsView = CollectionViewSource.GetDefaultView(List<T>); 
     FilterCalls(); 
     CallsView.Refresh(); 

//Filter method 
     private void FilterCalls() 
     { 
      if (CallsView != null) 
      { 
       CallsView.Filter = new Predicate<object>(FilterOut); 
       CallsView.Refresh(); 
      } 
     } 

私の意見が正しいのですか? datagridには多くの行が含まれているため、ビュー間の切り替えは遅いですか?または問題は、ICollectionViewのDataGridコントロールプロパティタイプでバインドすることですか?

ご意見、ご提案、ご意見ありがとうございます。

ここはscreen shotです。

Screen Shot http://i51.tinypic.com/2mzyzh4.jpg

+0

スクリーンショットへのリンクは動作しません。 – VoodooChild

+0

2番目のC#コード貼り付けでCallsView.Refresh()を2回実行していますか?実際に、リフレッシュコールをまったく行う必要がありますか? notifypropertychangedを実装すると、データの変更によってUIに通知が送信され、リフレッシュする必要があることがわかりました。 – evasilchenko

答えて

0

リボンタブがタブコントロールのタブと同じですが、TabControlのは、彼らが表示されていないしているとき、それはTabItemsだdestorys場合、私は肯定的ではありませんよ。これにより、タブに切り替えたときに各TabItemが再描画され、多数のコントロールを持つTabItemが再描画にかかる時間が顕著になります。

TabControlを使用して同様の問題が発生しましたが、タブを切り替えるとタブ全体が再描画され、切り替えが遅くなりました。私は、TabControlを拡張するhereというコードを使用して終了し、タブを切り替えるときにその子を破棄しないようにしました。多分あなたはリボンのタブと同様のことをすることができます