none
ユーザコントロールがデザイン画面を開くたびに縮む RRS feed

  • 質問

  • _BOSSと申します。
    ユーザコントロールがデザイン画面を開くたびに縮んでしまい、困っています。

    Windowsアプリケーションのプロジェクトにユーザコントロールを追加し、BorderStyleをFixed3D、英語対応を考えてLocalizableをTrueにします。ユーザコントロールを保存してデザイン画面を閉じ、再びデザイン画面を開き直すと、ユーザコントロールが4ピクセル縮んでしまいます。
    なお、ユーザコントロール内に配置したコントロールのサイズは変わらず、ユーザコントロールを広げ直したときにはそれに引っ張られて内部のコントロールが広がるので、それらを小さくし直すという作業が毎回発生します。

    これを回避する策はないものでしょうか。よろしくお願いいたします。

    2009年12月14日 15:16

回答

  • 「派生クラスのローカライズでフォントが変更されてしまう」
    http://social.msdn.microsoft.com/forums/ja-JP/csharpgeneralja/thread/c56f091c-3ba5-4d37-93ef-0d4cea326e4e/

    以前に上記スレで調べたとき、BorderStyle がローカライズ対象になっていないということを知りました。
    次の手順でこの問題を回避できそうです。

    1. 以下のクラスを作成
    2. ビルド
    3. アプリケーションに [新しい項目を追加]。この時、[カテゴリ] を "Windows Forms" とし、[テンプレート] から "継承されたユーザー コントロール" を選択する。
    4. [継承元コンポーネントの指定] にて以下のクラスを指定

    public class UserControlFix : UserControl
    {
        [Localizable(true)]
        public new BorderStyle BorderStyle
        {
            get { return base.BorderStyle; }
            set { base.BorderStyle = value; }
        }
    }

    • 回答の候補に設定 AzuleanMVP, Moderator 2009年12月15日 14:07
    • 回答としてマーク _BOSS 2009年12月16日 3:45
    • 回答としてマークされていない _BOSS 2009年12月16日 3:51
    • 回答としてマーク _BOSS 2009年12月16日 3:51
    2009年12月15日 1:35

すべての返信

  • Visual Studio の不具合に近い挙動です。本来は、開発環境のスケール差を吸収するための機能が、あやまって働いてしまっていると思います。

    記憶の限りでもうしわけないのですが、この問題が発生する条件として、Localized が true かつ ScaleMode が有効で、デフォルトリソースを含む言語リソースにフォント情報が保存されていない状態になっていると発生したと思います。

    デフォルトリソースを含めたすべての言語リソースに正しくフォント情報を格納することで、設計時のリサイズが発生しなくなりますが、設定したフォントによっては Visual Studio 上からリソースが変化するような操作を行ったタイミングにて Visual Studio にリソースファイルの冗長な設定を strip されて、再びこの状態に陥ったような記憶があります。

    当時の記憶だと、resx ファイルを直接編集するコンソールプログラムを作成して、resx の内容を保守していたと思います。
    2009年12月15日 0:30
  • 「派生クラスのローカライズでフォントが変更されてしまう」
    http://social.msdn.microsoft.com/forums/ja-JP/csharpgeneralja/thread/c56f091c-3ba5-4d37-93ef-0d4cea326e4e/

    以前に上記スレで調べたとき、BorderStyle がローカライズ対象になっていないということを知りました。
    次の手順でこの問題を回避できそうです。

    1. 以下のクラスを作成
    2. ビルド
    3. アプリケーションに [新しい項目を追加]。この時、[カテゴリ] を "Windows Forms" とし、[テンプレート] から "継承されたユーザー コントロール" を選択する。
    4. [継承元コンポーネントの指定] にて以下のクラスを指定

    public class UserControlFix : UserControl
    {
        [Localizable(true)]
        public new BorderStyle BorderStyle
        {
            get { return base.BorderStyle; }
            set { base.BorderStyle = value; }
        }
    }

    • 回答の候補に設定 AzuleanMVP, Moderator 2009年12月15日 14:07
    • 回答としてマーク _BOSS 2009年12月16日 3:45
    • 回答としてマークされていない _BOSS 2009年12月16日 3:51
    • 回答としてマーク _BOSS 2009年12月16日 3:51
    2009年12月15日 1:35
  • うまくいきました!ありがとうございます。

    BorderStyleをローカライズ対象に含めないといけないのですね。
    • 回答としてマーク _BOSS 2009年12月15日 3:45
    • 回答としてマークされていない _BOSS 2009年12月16日 3:44
    2009年12月15日 3:44
  • ご回答ありがとうございます。
    アドバイスいただいたとおりフォントを設定してみたのですが、残念ながら状況は改善されませんでした。
    しかしこういう問題もあるということで、頭に入れておこうと思います。
    2009年12月15日 3:56
  • 回答としてマークは、自身の投稿に対してするのではなく、役に立った回答に対してマークしましょう。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2009年12月15日 14:07
    モデレータ
  • ご指摘ありがとうございます。修正しました。
    #オペレーションミスです。なぜこうなったか全然覚えていません・・・。
    2009年12月16日 3:50