Помогите установить фокус на родителя - PullRequest
3 голосов
/ 06 января 2010

У меня есть простая ситуация (.NET2): texbox1 на UserControl1 (или Form1).

Я хочу расфокусировать (оставить) texbox, когда я нажимаю на usercontrol / form (фокусируем usercontrol/ вместо формы): альтернативный текст http://lh3.ggpht.com/_1TPOP7DzY1E/S0R1ORVt-pI/AAAAAAAAC3Y/UkS2zEMWa9o/s800/Capture4.png

В UC / форме я делаю следующее:

      Protected Overrides Sub OnMouseClick _
          (ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseClick(e)
        Me.Focus()
      End Sub

Почему это не работает в текстовом поле child , но очень хорошо работает на не дочерних (фокусировка на textBox2, затем нажатие на панели удаляет фокус из textBox2)?

Окно реального проекта

альтернативный текст http://lh5.ggpht.com/_1TPOP7DzY1E/S0SVniaeN1I/AAAAAAAAC3g/jafhFG-vA0g/s800/Capture5.png

Ответы [ 4 ]

3 голосов
/ 10 января 2010
  1. Добавьте новый элемент управления панели в форму (где-то в стороне) и измените его размер до 0,0
  2. НЕ устанавливайте Visible = false на этой панели.
  3. В вашей форме добавьте стандартный обработчик событий MouseClick следующим образом:

    private void Form1_MouseClick(object sender, MouseEventArgs e)
    {
        // Uncomment if in scrollable control
        //Point scrollPos = new Point(this.AutoScrollPosition.X, -this.AutoScrollPosition.Y);
        newPanel.Select(); 
        // Uncomment if in scrollable control
        //this.AutoScrollPosition = scrollPos;
    
    }
    
  4. Теперь, когда вы щелкаете в любом месте основной формы, любой элемент управления вводом теряет фокус, и вы сможете обрабатывать обычные события проверки и т. Д.
2 голосов
/ 06 января 2010

Вы боретесь со встроенным поведением как класса, так и класса UserControl. Они были написаны так, чтобы никогда не принимать фокус, если они содержат дочерние элементы управления, вместо этого они автоматически перемещают фокус на дочерний элемент. Встроенное поведение для класса ContainerControl, базовый класс для обоих. GroupBox - еще один.

Это имеет большой смысл, если вы об этом думаете: ни то, ни другое не может показать, что у них есть фокус, и нет ничего полезного, что могло бы случиться, когда пользователь начнет печатать.

Не исправляйте это, это только глубоко запутает пользователя.

2 голосов
/ 08 января 2010

Похоже, вы пытаетесь частично дублировать поведение, которое вы видите на диаграмме в Excel. Вы можете щелкнуть любой объект на диаграмме, и он будет выделен (имеет фокус), но если вы щелкнете за пределами области диаграммы, но все еще внутри объекта диаграммы, ничего не будет выбрано.

Это было бы очень знакомым поведением для людей, привыкших к диаграммам в Excel.

По сути, вам нужен элемент управления, который обычно принимает фокус. Я боролся с этой же проблемой в прошлом. Лучшее решение, которое я придумала (и под «лучшим» я не имею в виду, что оно на самом деле хорошо), - это создать пустое текстовое поле и поместить его за свой UserControl. Тогда ваш код для нажатия на элемент управления пользователя выглядит так:

Protected Overrides Sub OnMouseClick _
          (ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseClick(e)
        myFakeTextBox.Focus()
End Sub

Пользователь никогда не видит, чтобы это текстовое поле получало фокус. Все, что они видят, - это то, что теперь ничего не выбрано в форме, и они могут свободно заниматься своими делами.

Этот метод работает просто отлично, но с точки зрения обслуживания это немного головная боль, так как вы должны помнить, что фальшивое текстовое поле есть и для чего оно хорошо.

0 голосов
/ 06 января 2010

Лучше просто отловить событие мыши на вашем пользовательском контроле и установить фокус на себя. Это автоматически уберет фокус из текстового поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...