18

我正在开发一个 Windows 窗体应用程序。在我的应用程序中,我将控件锚定到表单,以便可以最大化表单并相应地安排控件。此应用程序应支持不同的 DPI 值。

我已将一些控件的锚点设置为底部、右侧和右下角。窗体的 AutoScroll 属性设置为 true。当 DPI 值为默认 (96) 时,控件按预期工作。但问题是,如果屏幕以更高的 DPI(如 120)加载,即使启用了表单滚动条,也无法看到锚定在底部和右下角的控件。

有人可以就这个问题给我建议吗?

问候, 埃兰加

4

4 回答 4

44

AutoScroll = True在表单属性中设置

在表单上设置 AutoScroll = true

于 2013-08-27T13:27:48.040 回答
14

创建一个Panel被调用的panel,然后执行以下操作:

panel1.autoscroll  = true;
panel1.BorderStyle = BorderStyle.FixedSingle;

使用此方法设置滚动宽度和高度:

panel1.SetAutoScrollMargin(int x,int y);
于 2012-10-13T09:19:50.940 回答
9

这是一个旧帖子,但问题仍在继续,相关帖子不断出现SO

我在这里做 necro 的事情,而不是仅仅因为它是我的谷歌搜索的顶部而解决一个更新的问题

问题很简单:“为什么我的屏幕上不会出现该死的滚动条ScrollableControl?”

不可能有具体的、确定的答案。因为原因是多方面的。因为滚动条是否出现在控件上取决于:

  • 不仅取决于它自己的属性设置
  • 还要根据它的父控件的状态
  • 以及任何子控件的状态。

在奶牛回家之前,很容易陷入随机旋转道具值的陷阱。或者去 i/webs &希望找到一些SOfoos。但是哦,亲爱的。以下是一些相关的SO帖子,其中提出了各种各样的提案:

水平滚动条在 DataGridView 上不可见

我的文本框上没有显示水平滚动条

如何在 Windows 窗体中设置滚动条

当包含的控件太大时,如何使滚动条出现在可调整大小的面板中?

c# 中的可滚动表单,AutoScroll=true 不起作用

如何在 VB.Net 的面板中获取滚动条?

VS-designer属性页面的屏幕截图(如这里)甚至一些基于代码的极端解决方案......我的最爱:

在 .NET 中将垂直滚动条添加到面板

如何在 Visualbasic.net 中添加 Vscroll 控件以形成窗体?

/叹气/


一个普遍的答案

..以最小的github 解决方案的形式来探索一些 .NET 滚动条的巫术:

https://github.com/violet313/TestWinForms/tree/Test1-Body-Panel

这是Visual Studio 2015使用.NET4.52 framework.

在解决方案中,我试图创建一个响应要显示的一些动态文本数据的表单。这是我最终寻求的基本布局:

--------------------------------------------------
|      fixed-size form header       |            | 
------------------------------------|   side     |
|                                   |   panel    |
|      dynamic content panel        |   stuff    |
|                                   |            |
--------------------------------------------------
|      fixed-size form trailer                   |               
--------------------------------------------------

我希望表格:

  • 不能由用户调整大小
  • 通过以下方式响应动态内容:

    • 尽可能缩小到预先确定的最小表格尺寸。
    • 长大到预定的最大表格尺寸;然后在动态内容面板上提供适当的滚动条。

抓住它,检查每个(从 95dccc5 开始只有 9 个)提交,然后以理智和渐进的方式测试你的需求。每当您进行可疑的状态更改时,请务必进行分支。

Irl:也许我是个笨蛋,但我花了一个多小时阅读 MSDN,试图(&failing)找出 .NET 表单控制属性的意外情况。以这种方式进行结构化的试错只花了我 20 分钟就得到了我想要的东西。


y~bwc

我知道这是一个 yeaz〜但谁在乎呢?但我必须离开我的胸膛。呵呵:

grrr。不得不揭开并回答这个问题是因为我需要有利可图地承担微软的合同工作。paymasters 可能相对(从开发人员的观点)非技术性,并且阅读了很多东西,包括:快速、简单、直接、安全等,给人的印象是 .NETish 是在公园。我的问题是,我很难合理地解释为什么他们可能需要为 n 天的工作付钱给我,以便让一个简单的滚动条出现在响应式表单上。

在这种情况下,我从来没有走那么远。哈哈。我花了几个小时涉足 MSDN 的废话,试图让它发生。然后打了个哈欠,放弃了,继续务实的实施。这被接受了。但现在是结束了,我是一个不能让事情发生的强迫症傻瓜。

于 2017-10-28T15:41:20.087 回答
0

我正在阅读此页面,我可以说它为您的问题提供了一个准确而简单的解决方案!

我对其进行了测试,它对我来说效果很好。

操作说明:

  1. 将清单文件添加到您的项目(项目-->新项目 --> 选择清单类型)
  2. 将以下 XML 添加到您的 app.manifest(可能是另一个名称)中:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
   <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
             <dpiAware>true</dpiAware>
        </asmv3:windowsSettings>
   </asmv3:application>
</assembly>
  1. 将以下 C# 代码添加到调用组件初始化 ( InitializeComponent();)的类中
[DllImport("shcore.dll")]
static extern int SetProcessDpiAwareness(_Process_DPI_Awareness value);

enum _Process_DPI_Awareness
{
    Process_DPI_Unaware = 0,
    Process_System_DPI_Aware = 1,
    Process_Per_Monitor_DPI_Aware = 2
}
  1. 现在只需在初始化组件方法上方添加此代码行(默认情况下InitializeComponent();
SetProcessDpiAwareness(_Process_DPI_Awareness.Process_DPI_Unaware);
于 2019-04-26T16:43:19.917 回答