当Form.AutoScroll = true

时间:2015-11-18 13:14:54

标签: c# winforms propertygrid

我的.NET Forms应用程序中存在PropertyGrid控件的问题 我尝试将一个ProperyGrid放在AutoScroll属性设置为true的Form上 当PropertyGrid位于Form的显示区域内时,它可以 但是,当PropertyGrid位于Form的显示区域之外时,PropertyGrid会导致意外滚动。

我很难用文字描述这个问题 以下是重现此问题的代码。

using System.Drawing;
using System.Windows.Forms;

namespace PropertyGridAutoScrollProblem
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            //InitializeComponent();

            Control[] controls = new Control[]
            {
                new TextBox(),
                new RadioButton(),
                new ListBox(),
                new ListView(),
                new PropertyGrid() { SelectedObject = this },
                new DataGridView(),
            };

            var tabControl = new TabControl();
            tabControl.Size = new Size(400, 400);
            tabControl.Location = new Point(50, 50);
            this.Controls.Add(tabControl);

            foreach (var control in controls)
            {
                control.Location = new Point(50, 250);
                control.Size = new Size(200, 100);

                var tabPage = new TabPage(control.GetType().Name);
                tabPage.Controls.Add(control);
                tabControl.Controls.Add(tabPage);
            }

            this.AutoScroll = true;
            this.ClientSize = new Size(400, 200);
        }
    }
}

这个程序有一些标签 每个选项卡包含一个与其选项卡名称相关的控件,位于Form的显示区域之外 如果单击" PropertyGrid"以外的任何选项卡,则不会进行滚动 但是,如果你点击" PropertyGrid"选项卡,将发生意外滚动。

These are the screenshots of this program.
最后一个(右下角)截图是在点击" PropertyGrid"之后。

有没有办法避免意外滚动?

更新1:

Here is the screenshots I tried and expected.

更新2:

@RezaAghaei感谢您的解决方案但对我来说并不完美..
我的预期结果是"没有滚动发生"。

Here is the screenshots I tried and expected.

更新3:

@RezaAghaei感谢您的回复。

根据我的理解,当我们取消选择表单并再次选择它时,表单会滚动显示通过AutoScroll默认行为显示焦点控件的左上角坐标。
并且,如果我单击第二个选项卡,将关注选项卡控件 我觉得这对我很自然。

如果在选择标签后单击标签页上的任何控件,则单击的控件将被聚焦,标签控件将失去焦点。
在这种情况下,如果我取消选择表单并再次选择它,表单将滚动显示单击控件的左上角坐标(不是制表符控件)。

1 个答案:

答案 0 :(得分:0)

问题

对于TabPagePanelForm这样的所有容器都会发生这种情况,以便PropertyGrid进入视图,行为是因为PropertyGrid中的代码构造函数,行259

SetActiveControlInternal(gridView);

解决方案是设置窗体的活动控件,或者当您需要滚动到容器到特定位置时。

如果同时滚动表单和标签页,则可能需要同时进行两种修复。

当TabPage滚动

当您的标签页滚动时,要解决此问题,您可以在所选标签更改时滚动至(0,0)

private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
{
    tabControl.SelectedTab.AutoScrollPosition = new Point(0, 0);
}

表单滚动

如果表单滚动,您可以滚动它以再次显示标签页:

private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
{
    this.ScrollControlIntoView(tabControl);
}

注意

  • 您还可以使用以下方法将此更正限制为特定标签:
//Suppose tabPage2 is the name of tab page that contains the PropertyGrid
if (tabControl.SelectedTab == this.tabPage2)

您的预期结果

我认为解决问题是依赖于布局的,对于您的具体情况,我使用此代码来获得您期望的结果:

tabControl.SelectedIndexChanged += (sender, e) =>
{
    if (tabControl.SelectedIndex == 4)
    {
        this.AutoScrollPosition = new Point(0,0);
        tabControl.SelectedTab.AutoScrollPosition = new Point(0, 0);
    }
};

但我认为使用下面的代码是更自然的解决方案,因为在使用上面的代码时,如果你最小化并恢复窗口,你将得到以下代码的结果。

tabControl.SelectedTab.AutoScrollPosition = new Point(0, 0);
this.ScrollControlIntoView(tabControl);