トップ回答者
ページ表示時のIEの「レイアウトの循環が検出されました」なるエラーについて

質問
-
お世話になります。
mkmarimoです。
Silverlight 2アプリで、ページ表示時にn×mのGridに動的にTextBoxを配置しようとしたとき、
nとmの値が大きくなると(大体25×10程度)、IEがページ表示時に以下のようなエラーを出力し、ページが表示できません。
【エラー内容】
Sys.InvalidOperationException: Runtime error 4008 in control 'Xaml1'
method : レイアウトの循環が検出されました。レイアウトを検出できませんでした。
このエラーの原因についてわかる方がいらっしゃいましたらご教授お願いします。
以下にソースを載せておきます。
【Page.xaml】<UserControl x:Class="LayoutTest.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"> <Grid x:Name="LayoutRoot" Background="#FFEAA9A9"> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> </Grid> </UserControl>
【Page.xaml.csコンストラクタ】
public Page() { InitializeComponent(); // テキストボックス追加のテスト int ROW = this.LayoutRoot.RowDefinitions.Count; int COLUMN = this.LayoutRoot.ColumnDefinitions.Count; TextBox[,] textBoxArray = new TextBox[ROW, COLUMN]; for (int i = 0; i < ROW; i++) { for (int j = 0; j < COLUMN; j++) { textBoxArray[i, j] = new TextBox(); textBoxArray[i, j].Width = double.NaN; textBoxArray[i, j].Height = double.NaN; textBoxArray[i, j].Text = i.ToString() + " ," + j.ToString(); this.LayoutRoot.Children.Add(textBoxArray[i, j]); Grid.SetRow(textBoxArray[i, j], i); Grid.SetColumn(textBoxArray[i, j], j); } } }
以上、よろしくお願いします。2009年4月22日 22:01
回答
-
良く見もせずに見当違いのことを書いてしまいました。すみません。
問題のエラーは英語表記にすると "Layout cycle detected. Layout could not complete." みたいですが、
これで検索すると↓のスレを見つけました。http://silverlight.net/forums/t/39037.aspx
Silverlight 2 の既知の問題で TextBox が多数 (250以上くらい) あるとこのエラーが出るそうです。
より正確には TextBox の中にある ScrollViewer がダメみたいです。良く読んでないんですが、TextBox を多数並べるのではなく、DataGrid を使って DataGridTextColumn で
並べてやるのであれば大丈夫みたいです。
あと、TextBox のテンプレートで
<Border x:Name="ContentElement" Padding="{TemplateBinding Padding}" BorderThickness="0" />
と ScrollVewier ではなく Border を使うようにしてしまうという方法もあるみたいです。
(シングルラインの TextBox の場合、ScrollViewer である必要はないということでしょう)
青柳 臣一 (Shinichi Aoyagi)- 回答としてマーク mkmarimo 2009年4月30日 8:09
2009年4月27日 4:14
すべての返信
-
mrt136と申します。
新規に VisualStudio 2008 Professional Edition で Silverlightプロジェクトを作成して
上記コードをそのままコピペしました。
その上で、上記の RowDifinition , ColumnDifinition をそれぞれ 50×25 まで増やして
実行してみましたが、エラーは出ませんでした。
#UserControl のサイズは 400×300 なので、テキストボックス自体は小さすぎて入力等は出来ないですが。。
何か他に原因があるような気がします。
mlmarimo さんの環境では、新規プロジェクトに上記コードのみでエラーが発生するので
しょうか。2009年4月24日 0:45 -
良く見もせずに見当違いのことを書いてしまいました。すみません。
問題のエラーは英語表記にすると "Layout cycle detected. Layout could not complete." みたいですが、
これで検索すると↓のスレを見つけました。http://silverlight.net/forums/t/39037.aspx
Silverlight 2 の既知の問題で TextBox が多数 (250以上くらい) あるとこのエラーが出るそうです。
より正確には TextBox の中にある ScrollViewer がダメみたいです。良く読んでないんですが、TextBox を多数並べるのではなく、DataGrid を使って DataGridTextColumn で
並べてやるのであれば大丈夫みたいです。
あと、TextBox のテンプレートで
<Border x:Name="ContentElement" Padding="{TemplateBinding Padding}" BorderThickness="0" />
と ScrollVewier ではなく Border を使うようにしてしまうという方法もあるみたいです。
(シングルラインの TextBox の場合、ScrollViewer である必要はないということでしょう)
青柳 臣一 (Shinichi Aoyagi)- 回答としてマーク mkmarimo 2009年4月30日 8:09
2009年4月27日 4:14