如何确保必须滚动的 UserControl 中控件的可见性?

How do I ensure visibility of a control in a UserControl that has to be scrolled?

我有一个 UserControl(我使用 WinForms),里面有很多组件,如果你想看到某个组件,你必须滚动 up/down 或 left/right。 我现在想实现一个搜索框,它允许您搜索一个组件,当您 select 它出现在结果(数据网格视图)中时,UserControl 将滚动以确保您可以看到 selected 组件.

我的第一个想法是检查组件位置是否大于 ClientSize,例如:

if (ivrMenu.X > _designerControl.ClientSize.Width && ivrMenu.Y > _designerControl.ClientSize.Height)
    MessageBox.Show("Down-Right");
else if (ivrMenu.X > _designerControl.ClientSize.Width)
    MessageBox.Show("Right");
else if (ivrMenu.Y > _designerControl.ClientSize.Height)
    MessageBox.Show("Down");

显然,只有当 H 和 V 的滚动位置都为 0 时,这才有效。因此,我必须考虑当前滚动位置的位置,或者我可以滚动到位置 0,然后让我的滚动到组件,但看起来不太好。

我的问题是,如何考虑滚动? 如何计算滚动位置可见区域的位置?

您可以使用 datagridview 尝试一些操作:

1) theGridView.FirstDisplayedScrollingRowIndex = theGridView.SelectedRows[0].Index;

2) theGridView.CurrentCell = theGridView.Rows[index].Cells[0];

第二个将滚动到项目而不将其移动到视图顶部。

我对我的组件的 ClientSize、AutoScrollPosition 和 Size 进行了一些计算,这段代码似乎工作得很好:

if (ivrMenu.X + ivrMenu.Width < _designerControl.AutoScrollPosition.X * (-1))
    MessageBox.Show("Left");

if (ivrMenu.X + ivrMenu.Width > _designerControl.ClientSize.Width - _designerControl.AutoScrollPosition.X)
    MessageBox.Show("Right");

if (ivrMenu.Y + ivrMenu.Height < _designerControl.AutoScrollPosition.Y * (-1))
    MessageBox.Show("Up");

if (ivrMenu.Y + ivrMenu.Height > _designerControl.ClientSize.Height - _designerControl.AutoScrollPosition.Y)
    MessageBox.Show("Down");

这是组件(在我的例子中是 ivrMenu)在 visibe ClientArea 之外的位置。 从这里我只需要滚动以使组件适合屏幕。