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

  • 質問

  • お世話になります。

    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

すべての返信

  • まったく試したりとかしてませんが、ぱっと見て気付いたところを。

    TextBox は LayoutRoot の子供じゃなくて、Grid の子供では?
    青柳 臣一 (Shinichi Aoyagi)
    2009年4月23日 1:19
  • Shinichi Aoyagiさま

    ご回答ありがとうございます。mkmarimoです。

    まったく試したりとかしてませんが、ぱっと見て気付いたところを。

    TextBox は LayoutRoot の子供じゃなくて、Grid の子供では?

    そのGiridのx:Name属性をLayoutRootにしているので、TextBoxはGridの子供になっているのでは
    ないのでしょうか??

    2009年4月23日 2:50
  • mrt136と申します。

    新規に VisualStudio 2008 Professional Edition で Silverlightプロジェクトを作成して
    上記コードをそのままコピペしました。

    その上で、上記の RowDifinition , ColumnDifinition をそれぞれ 50×25 まで増やして
    実行してみましたが、エラーは出ませんでした。
    #UserControl のサイズは 400×300 なので、テキストボックス自体は小さすぎて入力等は出来ないですが。。

    何か他に原因があるような気がします。
    mlmarimo さんの環境では、新規プロジェクトに上記コードのみでエラーが発生するので
    しょうか。
    2009年4月24日 0:45
  • mrt136さん

    mkmarimoです。
    わざわざお試しいただきありがとうございます。

    何か他に原因があるような気がします。
    mlmarimo さんの環境では、新規プロジェクトに上記コードのみでエラーが発生するので
    しょうか。


    はい、2環境でやってみましたがエラーが発生します。
    mrt136さんに試していただいたことで、プログラムのコード自体は誤ってないことがわかりましたので、
    たしかに他に原因がありそうです。

    何か有用な情報が得られるかもしれませんので本質問はもう少しオープン状態にさせていただきます。

    2009年4月24日 4:37
  • すみません。私の環境を書いていませんでしたが、Silverlight は 3 beta です。
    本件には関係無いとはいますが。。

    後、
    念の為、

    OS: Windows XP professional sp3 32bit
    メモリ:4G(実質3G強かな?)

    です。
    参考になれば幸いです。

    2009年4月24日 4:51
  • mrt136さん

    お世話になります。mkmarimoです。

    私の方も環境を書いてませんでしたので以下に記しておきます。
    2つの環境で試しました。

    Silverlightバージョン:2
    OS:Windows Vista Business SP1
    メモリ:2Gと4Gの2マシン

    です。
    2009年4月24日 7:46
  • 良く見もせずに見当違いのことを書いてしまいました。すみません。

    問題のエラーは英語表記にすると "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
  • 青柳様

    ご回答ありがとうございます。

    mkmarimoです。

    既知の問題ということで納得しました。

    私も今回のプログラムを作成しようとしたとき当初はDataGridを使って
    DataGridTextColumnをと考えておりましたが、どうも使い方がわからず
    納期との関係で断念し、TextBoxで代用することにし、今回の問題が発生してしまいました。

    Silverlight 2に関してはまだ、Webや書籍などの情報が少なくまた、
    ヘルプも私のレベルでは難しいので、困っているところでした。

    ご回答いただき助かりました。
    ありがとうございました。

    2009年4月30日 8:09