3

ここで小さな問題が発生していて、本当に困っています。私たちが何をしているのかを簡単に説明しましょう。

Windows フォームを作成し、.DLL として保存し、MDIContainer にロードします。フォームのコンポーネントとしてパネルを使用している場合、サイズが変更されることを除いて、問題ないように見えますが、問題なく動作します。

前:

ここに画像の説明を入力

後 (MDIContainer 内):

ここに画像の説明を入力

(パネルに注意してください!)。

これは、カスタム MDI コンテナーが原因であると推測しています。これは、MDI コンテナーのコードです。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace NAMESPACE.Forms
{
    class MdiClientPanel : Panel
    {
        private Form mdiForm;
        private MdiClient ctlClient = new MdiClient();

        public MdiClientPanel()
        {
            this.ctlClient.BackColor = Color.LightGray;
            base.Controls.Add(this.ctlClient);
        }

        public Form MdiForm
        {
            get
            {
                if (this.mdiForm == null)
                {
                    this.mdiForm = new Form();
                    System.Reflection.FieldInfo field = typeof(Form).GetField("ctlClient", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                    field.SetValue(this.mdiForm, this.ctlClient);
                }
                return this.mdiForm;
            }
        }
    }
}

これを修正する方法はありますか? 助けてくれてありがとう。

// 編集: 賞金を追加しました。理由を知りたいからです。再現方法:

  1. 新しいプロジェクトの新しいクラス内に MDIClientPanel コードをコピーします
  2. 2 番目のフォームを作成し、その中にいくつかのコントロールを配置します。
  3. MDIClient パネル内にフォームをロードします。
  4. コンパイルして、2 番目のフォームのサイズがどのように変化しているかを確認します。

これは、次のように 2 番目のフォームを開くと修正できます。

SecondForm Form = new SecondForm();
Form.MdiParent = this.MdiClientPanel.mdiForm;
Form.Size.Width += 35; //THIS PART WILL FIX
Form.Size.Height += 20; //THIS PART WILL FIX IT
Form.Show();

しかし、これが唯一の解決策である方法はありません。ちょっと怪しいです...

4

3 に答える 3

6

これが発生する理由は、パネルの境界が設定されていないためです。

次のいずれかの方法でこれを克服できるはずです。1 - パネルをドッキングします。

var x = new MdiClientPanel{Dock = DockStyle.Fill};
Controls.Add(x); //Add the control to the form

2 - パネルをすべてのコーナーに固定します。

x.Anchor = AnchorStyles.Top;
x.Anchor = AnchorStyles.Right;
x.Anchor = AnchorStyles.Left;
x.Anchor = AnchorStyles.Bottom;

このエラーを再現し、上記の方法を使用して修正することができました。

固定(前):

ここに画像の説明を入力

固定 (親のサイズ変更後):

ここに画像の説明を入力

ドック (前):

ここに画像の説明を入力

ドック (後 - 親のサイズ変更):

ここに画像の説明を入力

お役に立てれば。

于 2013-09-03T08:21:54.797 に答える
0

パネルをフォームに固定することを検討してください。これにより、親フォームのサイズに関係なく、パネルの周囲に均等なスペースが確保されます。一般的に私はこれよりも好きDockStyle.Fillです。

フォームを MDI 子として使用する場合、そのサイズの制御を MDI コンテナーに委任する必要があります。MDI の子がそれを適切に処理することを確認してください。

于 2013-09-03T08:13:37.253 に答える
0

設計時に幅と高さが固定されていますが、何らかの形でフォームに従ってサイズを変更することはできません。

通常、常にテーブル レイアウト パネルを使用し (同じフォームに複数のコントロールが表示されている場合)、コントロールごとに Dock を DockStyle.Fill に設定します。フォームにコントロールが 1 つしかない場合は、フォームまたは親コントロール (tableLayoutPanel など) に入力するようにコントロール自体を設定し、デザインまたはビハインド コードで次のように設定します。

pnl.Dock = DockStyle.Fill;

一部のコントロールの横にある程度のペースを残したい場合は、TableLayoutPanel を使用して、幅 (固定またはパーセンテージ) を持つ追加の列/行を作成します。次に、選択したセル内にコントロール (パネルなど) を配置し、dockstyle を設定して塗りつぶします。

于 2013-09-03T08:10:07.627 に答える