有没有办法让UserControl无法访问?
编辑:
所以SetStyle(ControlStyles.Selectable, false)
是要走的路。但仍然存在Control
的差异。如果继承表单Control
,则初始控件不会失去焦点。但是在点击了源自UserControl
和
ControlStyles.Selectable
应用焦点从初始控制中删除。
答案 0 :(得分:12)
在InitializeComponent()
之后的构造函数中,您需要调用SetStyle
并将ControlStyles.Selectable
样式设置为false
:
SetStyle(ControlStyles.Selectable, false);
答案 1 :(得分:5)
除ControlStyles.Selectable之外还有一个ControlStyles.ContainerControl - 该主题的文档相当稀疏(如果为true,则控件是类似于容器的控件),但它以某种方式影响子控件是否获得焦点而不是控件本身。
修改强>
我刚刚注意到另一个有趣的事实。在反射器中查看UserControl表明它强制在OnMouseDown中设置输入焦点。因此,在不调用base.OnMouseDown(e)的情况下重写OnMouseDown可以解决问题而没有副作用。
[EditorBrowsable(EditorBrowsableState.Advanced)]
protected override void OnMouseDown(MouseEventArgs e)
{
if (!this.FocusInside())
{
this.FocusInternal();
}
base.OnMouseDown(e);
}
答案 2 :(得分:2)
是的, SetStyle(ControlStyles.Selectable,false); 仅在您从控件继承时才有效。
如果您从用户控件继承,它将无效。
为了解决这个问题,我在用户控件中添加了一个面板,并将面板停靠在“Fill”上。 将其余控件添加到面板而不是用户控件。它奏效了!
答案 3 :(得分:1)
如果CanFocus属性返回false,则UserControl或任何Control将无法获得焦点。如果你看一下反射器中的代码,它基本上会检查3个属性,如果有的话,那么它将是不可聚焦的。
将前两个设置为false并具有正常运行的控制几乎是一个矛盾。如果你的控件能够在IsEnabled失效的情况下运行,那么这应该可行。
答案 4 :(得分:0)
启用=假,也许?
答案 5 :(得分:0)
通过将TabStop设置为false,您可以更接近您想要的内容。例如,当它的拥有形式上方的对话框关闭时,这将阻止控件聚焦。