質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2936閲覧

[WPF] Gridの RowDefinition Height="Auto" にすると DataGridの表示が遅くなるのはなぜでしょうか

shiroma77

総合スコア11

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2017/08/07 23:49

タイトル通りですが、Grid.RowDefinition の <RowDefinition Height="Auto"/> にすると、DataGridの表示が非常に遅くなります(実質フリーズ)。

<RowDefinition Height="*"/> の場合は即表示されます(1秒もかからない)。

例えば、100万件のPersonオブジェクトを表示するコードを書いてみます。

c#

1using System.Collections.ObjectModel; 2using System.Linq; 3 4namespace DataGridPerformanceTest 5{ 6 public class MainWindowViewModel 7 { 8 public ObservableCollection<Person> Persons { get; } = new ObservableCollection<Person>(); 9 10 public MainWindowViewModel() 11 { 12 foreach (var person in Enumerable.Range(1, 1000000).Select(_ => 13 { 14 return new Person() 15 { 16 Id = _, 17 Name = "田中太郎" + _.ToString() 18 }; 19 })) 20 { 21 Persons.Add(person); 22 } 23 } 24 } 25 26 public class Person 27 { 28 public int Id { get; set; } 29 public string Name { get; set; } 30 } 31}

ViewModelで100万件のPersonオブジェクトを生成し、Personsにぶちこみ、

xml

1<Window x:Class="DataGridPerformanceTest.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:local="clr-namespace:DataGridPerformanceTest" 5 Title="MainWindow" Height="350" Width="525"> 6 <Window.DataContext> 7 <local:MainWindowViewModel/> 8 </Window.DataContext> 9 <Grid> 10 <Grid.RowDefinitions> 11 <RowDefinition Height="Auto"/> ← ここをAutoにすると遅い 12 </Grid.RowDefinitions> 13 <DataGrid Grid.Row="0" ItemsSource="{Binding Persons}" /> 14 </Grid> 15</Window>

DataGridで100万件のPersonオブジェクトを表示します。
この時、<RowDefinition Height="Auto" /> にすると動作が重くなり、表示されるまで時間がかかります(実質表示されない)。

一方で、<RowDefinition Height="*" /> にすると動作が軽くなり、1秒もかからず表示されます。

この違いはなんでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

"Auto"の場合、配置するコントロールのサイズを元に自動的に割り当てられる、つまり対象となるコントロールサイズがどのくらいなのか実際に行を生成してMeasureしてるため遅くなっているのではないでしょうか?

"*" の場合は配置するコントロールのサイズに関係なく与えられた領域に配置するのでDataGridの仮想化が効いているのだと思います。

投稿2017/08/08 00:50

ebiryo

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiroma77

2017/08/10 00:19

Autoの場合は実際に行を生成し仮想化が効かないため遅くなるのですね…。 WPFはじめたばかりなので、仮想化を知りませんでした。 コレクションを表示する時は仮想化を意識してXamlを描いていかないとダメですね。 ちなみに仮想化については、下記URLを参考にしました。 http://matatabi-ux.hateblo.jp/entry/2014/08/06/120000 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問