winforms - 将 WinForms 控件填充到父级

标签 winforms f# .net-7.0

我正在尝试使用 WinForms 在 F# 中构建一个简单的文本编辑器。我想知道如何最轻松地让项目填充其父容器,并且我发现文本框未填充其父容器,尽管其 Dock 属性设置为 DockStyle.Fill 。我希望顶部的 MenuStripRichTextBox 都填充父容器并占据整个表单(正如您期望在文本编辑器中看到的那样)。这是演示该问题的屏幕截图:

Text Edit area too small!

如您所见,如果同时使用 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 窗体中。

了解更多:

示例 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)

enter image description here

关于winforms - 将 WinForms 控件填充到父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75045491/

相关文章:

c# - Crystal Report注册表项权限错误,在C#中使用Crystal Report Viewer

azure - 更改 "_master"功能键后,TimerTrigger Azure 功能卡住(未触发)

Azure Function(.NET 7 隔离)创建面向 .NET6 的 Azure Function App?

c# - 在 C# 中创建 Windows 标题栏区域中的选项卡

c# - 为什么 System.Threading.Timer 回调成功更新 UI?

list - F# 递归创建int list列表

f# - 如何从 FAKE 调用/调用 F# 编译器 fsc?

c# - TryReset CancellationSource .NET 标准

winforms - 处理 Label 和 PictureBox 的 KeyDown

F# 我想过滤我的输出