有没有办法使UserControl不可取消?

时间:2009-04-24 12:43:22

标签: .net winforms

有没有办法让UserControl无法访问?

编辑: 所以SetStyle(ControlStyles.Selectable, false)

是要走的路。但仍然存在Control的差异。如果继承表单Control,则初始控件不会失去焦点。但是在点击了源自UserControl

的控件之后
ControlStyles.Selectable

应用焦点从初始控制中删除。

6 个答案:

答案 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个属性,如果有的话,那么它将是不可聚焦的。

  • IsHandleCreated
  • ISVISIBLE
  • 的IsEnabled

将前两个设置为false并具有正常运行的控制几乎是一个矛盾。如果你的控件能够在IsEnabled失效的情况下运行,那么这应该可行。

答案 4 :(得分:0)

启用=假,也许?

答案 5 :(得分:0)

通过将TabStop设置为false,您可以更接近您想要的内容。例如,当它的拥有形式上方的对话框关闭时,这将阻止控件聚焦。