如何确保必须滚动的 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 之外的位置。
从这里我只需要滚动以使组件适合屏幕。
我有一个 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 之外的位置。 从这里我只需要滚动以使组件适合屏幕。