locked
時々、表示が思い切り崩れます RRS feed

  • 質問

  • 現在制作中のものは、DLLを使ってコントロールを分離するなどし、徐々に複雑になってきています。
    最近遭遇した問題なのですが、入れ子になったコントロールの表示がときどきかなりむちゃくちゃな表示に崩れてしまうことがあります。
    崩れるときはいつも同じように崩れます。
    例えば、自作の×ボタン(内部のウインドウ消去用に使用)は、四角の中に直線を2本引いて作っています。崩れるときは四角の枠も色も消え、中の×印の1本の線が四角をはみ出し、かつ全体には大きめに表示され、崩れた形の×のみになってしまいます。
    このコントロールは、そもそもサイズを変更できるように作っている別なコントロールに埋め込み、その外枠のサイズに応じて変換により全てを拡大、縮小するようにしてあります。

    この現象に確実な再現性はありません。また、滅多に発生しません。処理のタイミングによって、内部でWindowsのメッセージの順番が想定外のズレ方をするなどの不確定要素が関係しているようにも思えます。

    一度表示が崩れても、全体のサイズを変更して再描画すると正常に戻り、以後崩れなくなります。起動後、最初の表示の時にこの現象は発生する確率が高いようです。

    こういった問題を避けるための一般的な方法論などありますでしょうか。もしかするとWPFにも同じ問題が含まれているような気もします。
    例えば、透明度を0近くにして実際人の目には見えないようにして一度表示し、サイズを変更してもどし、という初期処理をする、という最も泥臭い方法は、場合によっては使えないと思いますし。

    あるいは、Silverlightの完成度が上がるのを待つ以外に方法は無いのでしょうか。

    2009年5月13日 10:23

回答

  • UpdateLayout() メソッドをいくつかのタイミングで使用することによりとりあえず現象を回避することができるようになりました。
    しかし、使用するタイミングによっては元の現象とは異なる別な問題を誘発することもあるようです。

    • 回答としてマーク 西猫 2009年5月29日 14:21
    2009年5月29日 14:20

すべての返信

  • これ、結構苦しい問題なんですね。

    画面の大きさに応じてほぼ全ての要素を比例させて拡大、縮小していますが、特に最大化(全画面化)した後にボタン操作等で新たな表示を行うと、その部分が崩れることが多いです。

    私はSilverlightのレンダリングエンジンに問題があるはずと考えています。Silverlightは2.0の正式版が最初にリリースされて以後、バージョンアップなどはされているのでしょうか?

    実際の動作をご覧いただきたいところなのですが、企業秘密というやつで・・・
    再現させるための単純化したコードも提示できればいいのですが、そこまでの労力を割く余裕がありません。

    他に、同じような問題に遭遇された方はいらっしゃらないでしょうか。
    2009年5月28日 18:18
  • 西猫様もおっしゃいましたが…
    非常に苦しい問題です。明確なものもなく、厳密な再現性も確証しきれません。

    【西猫様のご投稿】
    >他に、同じような問題に遭遇された方はいらっしゃらないでしょうか

    厳密には同じ経験ではありませんが、例えば縦スクロールが発生する画面などで、
    すばやく画面下部までスクロールした場合、デザインが崩れるとユーザ様からご指摘を頂いたことがあります。
    とくにコーディング上、デザイン上では懸念とされるものが見当たらず、
    こちらの環境では一度も発生しなかったので、クライアントアプリの画面描画とブラウザの同期で発生する可能性があるという一次回答を出しました。

    自分が所属するチームの場合、ブラウザのサイズ、ディスプレイの解像度から動的にコントロールを配置し、
    大きさを逆算するような外部クラスを実装しています(社外秘なので、設計、ソースの公開はできませんが)。

    しかし、西猫様が仰ったレンダリングエンジンの問題であるとすれば、
    いつ崩れが発生してもおかしくないのは事実です。

    やはり…今後のリリースに期待ということになってしまうかもしれませんね…
    2009年5月29日 0:54
  • jun-f さんありがとうございます。
    似たような問題に遭遇された方が他にもいらっしゃったことを知ることができただけでも良かったです。

    しかし、もしかするとSilverlightの親玉であるWPFでも同様の問題が発生するのかも知れないと頭をよぎりました。
    だとすると、将来的にもこの問題は改善されない確率が高いのではないかと考えられます。
    逆に、WPFでは一切こういった問題が発生しないのであれば、よりそれに近づくSilverlight3では直るのかも知れません。

    Silverlightの根本的な価値を左右する問題だと思いますので、こういった情報のみでもメーカーとして再現試験を試みていただきたいと強く願いたいです。

    2009年5月29日 9:41
  • UpdateLayout() メソッドをいくつかのタイミングで使用することによりとりあえず現象を回避することができるようになりました。
    しかし、使用するタイミングによっては元の現象とは異なる別な問題を誘発することもあるようです。

    • 回答としてマーク 西猫 2009年5月29日 14:21
    2009年5月29日 14:20