【问题标题】:How do I set focus to a Usercontrol如何将焦点设置到用户控件
【发布时间】:2017-01-21 04:04:25
【问题描述】:

我有 50 个用户控件,我动态添加到 flowlayoutPanel。 我需要将焦点设置为用户控件,但它不起作用。 我一直在搜索,但找不到任何我理解的例子。

我发现的唯一例子是这个 Setting Focus to a .NET UserControl...?

我尝试使用 userCtrl.Focus();但它没有用。 正如我一直在阅读的用户控件不喜欢有焦点。

【问题讨论】:

  • UserControls 是否包含其他控件?如果是这样,您可以专注于其中之一。
  • this.ActiveControl = YourControl;
  • 按照其他人的评论设置 ActiveControl。此外,它们是您的用户控件!如果您给他们一个公共的 FocusOnMe() 方法并对该方法进行编码以在您想要的位置设置焦点,那么您的表单可以说 myUserControl.FocusOnMe()。
  • UserControl 真的很讨厌获得焦点并尽可能避免它。尽可能将其传递给子控件。它对焦点没有任何用处,它不能告诉用户它有焦点并且对键盘输入没有任何用处。这引出了一个问题,您为什么要与之抗争,这个问题非常不清楚。您关于它的另一个问题表明您实际上希望 FLP 具有焦点。它也不喜欢。给予 FLP 焦点需要手术 like this.
  • 签出this。

标签: c# winforms user-controls


【解决方案1】:

您可以使用ActiveControl 属性将焦点设置到控件

this.ActiveControl = myUserControl;

【讨论】:

    【解决方案2】:

    补充:现在我对Control 类有了更多的了解,我 了解如果您从 Control 派生,则不应订阅 到它的事件,但使用 On.. 函数,如OnEnter。我有 相应地改变了我的答案

    要激活任何Control,包括UserControl,请使用Control.Select()。

    如果您对TextBox 执行此操作,您会看到Select 确保它获得输入焦点。

    我猜你想对选定的UserControl(具有焦点的Control)做一些事情,例如,你想改变它的外观,或者选择它上面的任何控件。为此,您的 UserControl 类必须订阅事件 Control.Enter 和 Control.Leave

    我创建了一个带有CheckBox 的UserControl,只要选择UserControl(具有输入焦点)就会自动检查它:

    补充:如果你从控件派生,不要订阅事件Enter 和Leave。而是覆盖引发这些事件的函数: OnEnter / OnLeave。

    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
    
        protected override void OnEnter(EventArgs e)
        {
            this.checkBox1.Checked = true;
            base.OnEnter(e); // this will raise the Enter event
        }
    
        protected override void OnLeave(EventArgs e)
        {
            this.checkBox1.Checked = false;
            base.OnLeave(e); // this will raise the Leave event
        }
    }
    

    我有一个带有按钮的表单,以及一个在单击按钮时调用的事件处理程序:

    private void OnButton1Clicked(object sender, EventArgs e)
    {
        this.userControl1.Select();
    }
    

    现在,每当单击按钮时,我都会看到用户控件获得焦点,因为复选框已选中,而每当我单击其他位置时,复选框均未选中。

    【讨论】:

      【解决方案3】:

      虽然你没有详细说明你的意思是什么意思它不起作用,但传统上聚焦有很多方面。

      1.显式聚焦

      调用控件的Focus()方法与设置容器窗体的ActiveControl相同。如果CanFocus 返回true(您的控件及其所有父控件都可见并已启用),则它可以工作;但是,除了一些间接提示,您将没有视觉反馈,例如。最初获得焦点的控件(按钮或文本框)失去焦点。

      要可视化聚焦状态,您可能需要使用一些自定义绘制:

      protected override void OnPaintBackground(PaintEventArgs e)
      {
          e.Graphics.Clear(Focused ? SystemColors.Highlight : SystemColors.Control);
      }
      

      如果您直接从Control 派生而不是UserControl,请覆盖以下两种方法以在更改焦点状态时强制重绘:

      protected override void OnGotFocus(EventArgs e)
      {
          Invalidate();
          base.OnGotFocus(e);
      }
      
      protected override void OnLostFocus(EventArgs e)
      {
          base.OnLostFocus(e);
          Invalidate();
      }
      

      2。鼠标对焦

      要通过单击控件来获得焦点,请将此行添加到构造函数:

      SetStyle(ControlStyles.Selectable, true);
      

      如果您直接从 Control 派生而不是 UserControl,请也覆盖 OnMouseDown:

      protected override void OnMouseDown(MouseEventArgs e)
      {
          if (!Focused)
              Focus();
          base.OnMouseDown(e);
      }
      

      3.通过键盘对焦

      要通过 TAB 键获得焦点,只需将 TabStop 属性设置为 true 并调整 TabOrder 属性即可。

      【讨论】:

        【解决方案4】:

        以 textBox1 为重点的示例:

        textBox1.Select();
        

        【讨论】:

          【解决方案5】:

          你可以试试用户控件的标签索引。如果您将其标签索引设置为 1,它将在程序启动后获得焦点。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-21
            • 2016-10-22
            • 1970-01-01
            • 2011-10-26
            • 1970-01-01
            • 2022-07-18
            相关资源
            最近更新 更多