当Form.Autocroll=true时,PropertyGrid会导致意外滚动

本文关键字:意外 滚动 PropertyGrid Autocroll Form true | 更新日期: 2023-09-27 18:22:26

我的.NET Forms应用程序中的PropertyGrid控件出现问题
我尝试在窗体上放置一个ProparyGrid,该窗体的AutoScroll属性设置为true
当PropertyGrid位于表单的显示区域内时,它是可以的。
但是,当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);
        }
    }
}

这个程序有一些选项卡
每个选项卡都包含一个与其选项卡名称相关的控件,位于窗体的显示区域之外。
如果单击除"PropertyGrid"之外的任何选项卡,则不会发生滚动
但如果您单击"PropertyGrid"选项卡,将发生意外的滚动。

这些是这个程序的屏幕截图
最后一张(右下角)屏幕截图是在单击"PropertyGrid"之后。

有什么方法可以避免意外滚动吗?

更新1:

这是我尝试并期待的屏幕截图。

更新2:

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

这是我尝试并期待的屏幕截图。

更新3:

@RezaAghaei谢谢你的回复。

在我的理解中,当我们取消选择窗体并再次选择它时,窗体会通过AutoScroll默认行为滚动以显示聚焦控件的左上角坐标
而且,如果我单击第二个选项卡,选项卡控件将被聚焦
我认为这对我来说很自然。

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

当Form.Autocroll=true时,PropertyGrid会导致意外滚动

问题

这将发生在所有容器(如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);