如何确保必须滚动的用户控件中的控件的可见性

本文关键字:控件 滚动 可见性 用户 何确保 确保 | 更新日期: 2023-09-27 17:56:24

我有一个UserControl(我使用WinForms),里面有很多组件,如果你想看到某个组件,你必须向上/向下或向左/向右滚动。我现在想要实现一个搜索框,它允许您搜索组件,当您在结果(datagridview)中选择它时,UserControl 将滚动以确保您可以看到所选组件。

我的第一个想法是检查组件位置是否大于 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和组件的大小做了一些数学运算,这段代码似乎可以完美运行:

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客户区之外的位置。由此,我只需要进行滚动,以便组件适合屏幕。