在Windows窗体中启用滚动条

时间:2012-04-05 05:21:17

标签: c# winforms

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

我已将某些控件的锚点设置为bottom,right和bottom-right。表单的AutoScroll属性设置为true。当DPI值处于默认值(96)时,控件按预期工作。但问题是如果屏幕加载的DPI较高(如120),即使启用了表单滚动条,也无法看到固定在底部和右下方的控件。

有人可以就此问题告诉我吗?

的问候, Eranga

4 个答案:

答案 0 :(得分:27)

在表单属性中设置AutoScroll = True

Set AutoScroll = true on form

答案 1 :(得分:11)

假设我们有一个具有id“panel1”的面板 然后我们可以申请

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

设置滚动宽度和高度

panel1.SetAutoScrollMargin(int x,int y);

答案 2 :(得分:3)

这是一个旧帖子,但问题仍然存在,相关帖子只是继续SO

我在这里做坏死的事情,而不是仅仅因为它来自我的google search

而解决了一个更近期的问题

问题很简单:"为什么我的ScrollableControl上出现该死的滚动条?"

可能没有特定的,明确的答案。因为原因很多。因为滚动条是否出现在控件上取决于:

  • 不仅仅依据它自己的属性设置
  • 但也取决于其父母控制的状态
  • 以及任何儿童控制的状态。

在奶牛回家之前,它很容易落入随机摆弄道具价值的陷阱。或者继续i / webs并希望找到一些SO foos。但亲爱的哦。以下是一些相关的SO帖子,提出了各种各样的决议:

Horizontal Scrollbar is not visible on DataGridView

Horizontal scrollbar not showing on my textbox

How to set scroll bar in Windows form

How to make scrollbars appear in a resizable panel when the contained control is too big for it?

Scrollable Form in c#, AutoScroll=true doesn't work

How to get scrollbar in Panel in VB.Net?

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

Add vertical scroll bar to panel in .NET

how to add Vscroll control to form in Visualbasic.net?

/叹气/

一般答案

..以 minimal github解决方案的形式,以探索一些.NET滚动条voodoos:

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

使用Visual Studio 2015的{​​{1}}解决方案。

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

.NET4.52 framework

我想要表单:

  • 用户无法调整大小
  • 通过以下方式回复动态内容:

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

抓住它,然后每个(从95dccc5开始只有9个)提交,然后以理智的方式测试你的要求。增量时尚。每当你做出一个可疑的状态变化时,一定要分支。

Irl:也许我很胖但是我花了一个多小时阅读MSDN尝试(并且失败)来弄清楚.NET表格控制属性的突发事件。以这种方式进行结构化的反复试验只花了我20分钟才得到我想要的东西。

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

  

我知道这里有一个 yeaz~但是谁在乎呢?但是我不得不离开我的胸口。嘿:

 哎呀。因为我的需要而不得不发表并回答这个问题  有利可图地承担微软的合同工作。 paymasters可以  相对(来自开发人员pov)非技术性的,并且阅读了很多  包括以下词语:快速,简单,直接,安全,  等等,给人一种.NETish漫步的印象  公园。我的问题是我会遇到困难  试图合理地解释为什么他们可能需要支付我n-day的费用  值得的工作,以便在一个简单的滚动条上显示  响应形式。  

 在这个场合,我从未走得那么远。大声笑。我花了几个小时  试图让MSDN肆意挥霍。然后打了个哈欠,  放弃了,并继续进行务实的实施。这是  公认。但它现在是w / end,我是一个不能放过的傻瓜  事情就是。

答案 3 :(得分:0)

我正在阅读this page,可以说它为您的问题提供了准确而又简单的解决方案!

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

说明:

  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);