我正在尝试使用 WinForms 在 F# 中构建一个简单的文本编辑器。我想知道如何最轻松地让项目填充其父容器,并且我发现文本框未填充其父容器,尽管其 Dock
属性设置为 DockStyle.Fill
。我希望顶部的 MenuStrip
和 RichTextBox
都填充父容器并占据整个表单(正如您期望在文本编辑器中看到的那样)。这是演示该问题的屏幕截图:
如您所见,如果同时使用 MenuStrip 和 RichTextBox 来填充整个表单,那就太好了。
以下是代码(以及 .fsproj
文件):
程序.fs:
module FsEdit.Program
open System
open System.Windows.Forms
[<EntryPoint; STAThread>]
let main argv =
Application.Run FsEdit.MainForm.MainForm
0
MainForm.fs:
[<RequireQualifiedAccess>]
module FsEdit.MainForm
open System.Windows.Forms
// MenuBar
let private FileMenuTab =
new ToolStripMenuItem(
Text = "File"
)
let private EditMenuTab =
new ToolStripMenuItem(
Text = "Edit"
)
let private AboutMenuTab =
new ToolStripMenuItem(
Text = "About"
)
let private MainMenuStrip =
new MenuStrip(
Text = "MainMenuStrip"
)
let private allMenuStripItems =
[|
FileMenuTab
EditMenuTab
AboutMenuTab
|]
|> Array.map (fun tab -> tab :> ToolStripItem)
MainMenuStrip.Items.AddRange(allMenuStripItems)
// Text Editor
let private MainTextBox =
let richTextBox = new RichTextBox(
Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut a eleifend nunc. Suspendisse non purus varius, ullamcorper arcu et, vehicula lacus. Integer pellentesque facilisis interdum. Aliquam id leo arcu. Nam mauris nisl, semper eget massa sed, aliquam convallis lacus. Etiam a neque blandit, sollicitudin nisl quis, ornare dui. Aliquam nec lorem sit amet arcu iaculis elementum rutrum eu velit. Curabitur dignissim blandit ligula at efficitur. Curabitur id justo quis tortor egestas ultrices. Nam arcu quam, ullamcorper id velit quis, aliquam finibus libero. Pellentesque semper fermentum sem a scelerisque. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;"
)
richTextBox.Dock <- DockStyle.Fill
richTextBox.Anchor <- AnchorStyles.Left ||| AnchorStyles.Right ||| AnchorStyles.Top
richTextBox.AllowDrop <- true
richTextBox.AutoSize <- true
richTextBox
let private MainTextBoxPanel =
let p = new FlowLayoutPanel()
p.Dock <- DockStyle.Fill
p.WrapContents <- false
p.FlowDirection <- FlowDirection.TopDown
p.Anchor <- AnchorStyles.Left ||| AnchorStyles.Right ||| AnchorStyles.Top
p
MainTextBoxPanel.Controls.Add(MainMenuStrip)
MainTextBoxPanel.Controls.Add(MainTextBox)
// MainForm
let MainForm =
let form = new Form(
Text = "FsEdit"
)
form.Width <- 800
form.Height <- 600
form
MainForm.Controls.Add(MainTextBoxPanel)
FsEdit.fsproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<UseWpf>true</UseWpf>
</PropertyGroup>
<ItemGroup>
<Compile Include="MainForm.fs" />
<Compile Include="Program.fs" />
</ItemGroup>
</Project>
如何让这些 Control 对象成功填充其各自的父对象?
最佳答案
此行为是具有自上而下流向的 FlowLayoutPanel 的预期行为。根据documentation :
This is the general rule for anchoring and docking in the FlowLayoutPanel control: for vertical flow directions, the FlowLayoutPanel control calculates the width of an implied column from the widest child control in the column. All other controls in this column with Anchor or Dock properties are aligned or stretched to fit this implied column.
如果您想将控件停靠到顶部并填充,则不需要 FlowLayoutPanel。请改用面板。
您可以使用以下布局之一:
- Form
- Menu (Dock = Top)
- RichTextBox (Dock = Fill)
或者,如果出于某种原因您希望将菜单和文本编辑器托管在与容器相同的面板中:
- Form
- Panel (Dock = Fill)
- Menu (Dock = Top)
- RichTextBox (Dock = Fill)
重要提示: 请注意向表单添加控件的顺序。控件的 Z 顺序很重要,并且会影响结果。控件以反向 z 顺序停靠。您可能想了解更多关于 how to dock and anchor controls在 Windows 窗体中。
了解更多:
- How to: Anchor and Dock Child Controls in a FlowLayoutPanel Control
- FlowLayoutPanel control overview
- Position and layout of controls
- How to dock and anchor controls
示例 1 - 将菜单停靠在顶部,将 RichTextBox 停靠在填充位置,并将 StatusStrip 停靠在底部
在表单中使用以下代码,它将把 Menu 停靠到顶部,将 RichTextBox 停靠到 Fill,将 StatusStrip 停靠到底部,而不使用任何其他容器:
[<RequireQualifiedAccess>]
module FsEdit.MainForm
open System.Windows.Forms
open System.Drawing
// Main menu strip
let private FileMenuTab =
new ToolStripMenuItem(
Text = "File"
)
let private EditMenuTab =
new ToolStripMenuItem(
Text = "Edit"
)
let private AboutMenuTab =
new ToolStripMenuItem(
Text = "About"
)
let private MainMenuStrip =
let m = new MenuStrip(
Text = "MainMenuStrip"
)
m
let private allMenuStripItems =
[|
FileMenuTab
EditMenuTab
AboutMenuTab
|]
|> Array.map (fun tab -> tab :> ToolStripItem)
MainMenuStrip.Items.AddRange(allMenuStripItems)
// Text Editor
let private MainTextBox =
let richTextBox = new RichTextBox(
Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut a eleifend nunc. Suspendisse non purus varius, ullamcorper arcu et, vehicula lacus. Integer pellentesque facilisis interdum. Aliquam id leo arcu. Nam mauris nisl, semper eget massa sed, aliquam convallis lacus. Etiam a neque blandit, sollicitudin nisl quis, ornare dui. Aliquam nec lorem sit amet arcu iaculis elementum rutrum eu velit. Curabitur dignissim blandit ligula at efficitur. Curabitur id justo quis tortor egestas ultrices. Nam arcu quam, ullamcorper id velit quis, aliquam finibus libero. Pellentesque semper fermentum sem a scelerisque. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;"
)
richTextBox.Dock <- DockStyle.Fill
richTextBox.AllowDrop <- true
richTextBox.AutoSize <- true
richTextBox
let private MainStatusBar =
let s = new StatusStrip()
s.Dock <- DockStyle.Bottom
s
// MainForm
let MainForm =
let form = new Form(
Text = "FsEdit"
)
form.Width <- 800
form.Height <- 600
form.MinimumSize <- Size(320, 240)
form
MainForm.Controls.Add(MainTextBox)
MainForm.Controls.Add(MainMenuStrip)
MainForm.Controls.Add(MainStatusBar)
关于winforms - 将 WinForms 控件填充到父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75045491/