想象一下,我在3x3磁贴中有一个带有9个控件(TabbedStuffControl)的Form,这些控件包含包含另一个带ListBoxes和TextBoxes的控件(StuffControl)的TabControls。
我想知道让TabbedStuffControl让它的孩子获得焦点的正确方法吗?例如用户点击StuffControl的文本框或将某些东西拖到StuffControl的列表框中。最终,表单应该知道哪个TabbedStuffControl是活动的
我是否需要连接TextBoxes和ListBoxes以及TabControls的 GotFocus 事件,然后发送另一个事件,最终让Form知道谁有焦点?我认为应该有一个更简单的方法 - 以某种方式TabbedStuffControl 知道它的孩子得到了焦点,所以在代码中只有一个地方我会挂钩。
感谢。
答案 0 :(得分:2)
使用Enter事件(比GotFocus更好)肯定是一个很好的方法。订阅所有控件的处理程序,然后在Enter事件处理程序中找到控件的父级。此示例代码演示了该方法:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
wireEnter(this.Controls);
}
private void wireEnter(Control.ControlCollection ctls) {
// Hook Enter event for all controls
foreach (Control ctl in ctls) {
ctl.Enter += ctl_Enter;
wireEnter(ctl.Controls);
}
}
TabbedStuffControl mParent;
private void ctl_Enter(object sender, EventArgs e) {
// Find parent
Control parent = (sender as Control).Parent;
while (parent != null && !(parent is TabbedStuffControl)) parent = parent.Parent;
if (parent != mParent) {
// Parent changed, do something. Watch out for null
//....
mParent = parent as TabbedStuffControl;
}
}
}
答案 1 :(得分:0)
你必须使用COM:
// Import GetFocus() from user32.dll
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
internal static extern IntPtr GetFocus();
protected Control FocusControl
{
get
{
Control focusControl = null;
IntPtr focusHandle = GetFocus();
if (focusHandle != IntPtr.Zero)
// returns null if handle is not to a .NET control
focusControl = Control.FromHandle(focusHandle);
return focusControl;
}
}