前提・実現したいこと
Formやコンテナ等の大きさに合わせて子コントロールの位置を変更したいです
formで上下左右の中央にtextboxを表示し
ウィンドウの大きさが変更されても常に中央に表示されるようにすることは可能でしょうか?
条件として、大きさは固定で位置だけを変えたいです
試したこと
dockでは端に固定されてしまいますしanchorでは位置ではなく大きさの拡大縮小で調整されてしまいます。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/17 03:18

回答2件
0
既存のプロパティでは出来ないので作ってみました。
Centering プロパティを True にすると親の中央に配置します。
C#
1 using System; 2 using System.ComponentModel; 3 using System.Drawing; 4 using System.Windows.Forms; 5 6 class CenteringTextBox : TextBox 7 { 8 private static object EventCenteringChanged = new object(); 9 private bool _Centering = true; 10 private Control _ParentInternal = null; 11 12 [DefaultValue(true)] 13 public bool Centering { 14 get { 15 return _Centering; 16 } 17 set { 18 if (Centering != value) { 19 _Centering = value; 20 DoLayout(); 21 OnCenteringChanged(EventArgs.Empty); 22 } 23 } 24 } 25 26 protected virtual void OnCenteringChanged(EventArgs e) { 27 EventHandler eh = Events[EventCenteringChanged] as EventHandler; 28 if (eh != null) eh(this, e); 29 } 30 31 public event EventHandler CenteringChanged { 32 add { 33 Events.AddHandler(EventCenteringChanged, value); 34 } 35 remove { 36 Events.RemoveHandler(EventCenteringChanged, value); 37 } 38 } 39 40 private void DoLayout() { 41 if (Centering && Parent != null) { 42 Rectangle pr = Parent.ClientRectangle; 43 int x = (pr.Right - pr.Left - Width) / 2; 44 int y = (pr.Bottom - pr.Top - Height) / 2; 45 Location = new Point(x, y); 46 } 47 } 48 49 protected override void OnParentChanged(EventArgs e) { 50 base.OnParentChanged(e); 51 ParentInternal = Parent; 52 } 53 54 protected override void Dispose(bool disposing) { 55 base.Dispose(disposing); 56 ParentInternal = null; 57 } 58 59 private Control ParentInternal { 60 set { 61 if (_ParentInternal != null) { 62 _ParentInternal.Resize -= Parent_Resize; 63 } 64 _ParentInternal = value; 65 if (_ParentInternal != null) { 66 _ParentInternal.Resize += Parent_Resize; 67 DoLayout(); 68 } 69 } 70 } 71 72 private void Parent_Resize(object sender, EventArgs e) { 73 DoLayout(); 74 } 75 76 protected override void OnSizeChanged(EventArgs e) { 77 base.OnSizeChanged(e); 78 DoLayout(); 79 } 80 81 protected override void OnLocationChanged(EventArgs e) { 82 base.OnLocationChanged(e); 83 DoLayout(); 84 } 85 }
投稿2022/01/14 06:09
総合スコア2721
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2022/01/14 06:31

0
- 3x3のTableLayoutPanelをフォームに配置(Dock=Fillに設定)
- TableLayoutPanelの1,3行目と1,3列目を50%、2行目と2列名を固定したいサイズに設定
- 中央にしたいコントロールをTableLayoutPanelの真ん中に置く
で、それっぽくなるんじゃないでしょうか。
それ以外の方法だと、SizeChangedイベントで自力で親フォームのサイズとコントロールのサイズから位置を再計算するしかないと思います。
投稿2022/01/14 06:03
編集2022/01/14 06:04
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。