2009-06-22 10 views
2

우리 응용 프로그램의 동작처럼 alt-tab을 구현하려고합니다. 사용자가 ctrl-tab을 누르면 폼이 나타납니다 (ShowDialog 사용). 그들은 다시 그것을 누르면 앱의 메인 폼에 다음 컨트롤을 집중시킵니다. Ctrl 키를 놓으면 양식이 숨겨집니다.ShowDialog가 종료 될 때 포커스 변경을 방지하려면 어떻게합니까?

그런 경우에는 포커스가있는 컨트롤과 다른 컨트롤로 포커스가 전송됩니다. ShowDialog가 종료 될 때 포커스 변경을 방지하려면 어떻게합니까?

+0

어떤 그래픽 라이브러리를 사용하고 있습니까? WinForms 또는 WPF? –

+1

Ctrl-Tab 대화 상자와 응용 프로그램의 기본 창에 대한 여러 참조가 "양식"으로되어 있기 때문에 winforms 탭을 추가했습니다. –

답변

1

"to"포커스 컨트롤을 속성으로 허용하는 사용자 지정 대화 상자를 작성할 수 있습니다. 종료 할 때 포커스를 "to"컨트롤로 설정할 수 있습니다.

0

대화 상자의 작동 방식을 변경하는 것이 좋습니다. 내가하는 말을 이해하면 대신 CtrlTabDialog에 어떤 컨트롤이 포커스를 가져야하는지 나타내는 속성을 만들 수 있습니다. 그런 다음 ShowDialog()이 종료되면 CtrlTabDialog 양식을 처리하기 전에 해당 속성을 읽고 처음에 양식을 생성 한 모든 코드에서 포커스를 적절히 설정할 수 있습니다.

0

이러한 목적으로 ShowDialog()를 사용하면 안됩니다. 대신 Show() 및 Hide()를 사용하여 기본 폼 내부의 제어 논리를 사용해야합니다.

또한 폼 활성화를 방지 할 수도 있습니다.이 경우 폼 하위 항목을 만들고 ShowWithoutActivation 메서드를 재정의 할 수 있습니다.

또한 내 게시물 here을 읽을 수 있습니다.

0

내가 설명하는 동작을 어떻게 처리하는지 보여주는 작은 응용 프로그램을 작성했습니다.

4 개의 컨트롤 (이 예제의 버튼은 원하는 컨트롤 일 수 있음)을 사용하여 기본 폼을 설정했습니다. 그런 다음 나는 선택자의 역할을하는 또 다른 형식을 설정했다. 이 예제에서는 ListBox에 컨트롤 이름이 포함되어 있습니다. 뭔가 더 좋아할 수 있습니다. 현재 포커스가있는 컨트롤을 전달하여 목록에서 이미 선택된 컨트롤을 가질 수도 있습니다. 나는 목록의 첫 번째 컨트롤을 기본값으로 사용했다.

선택기 컨트롤에서 선택한 컨트롤을 보유하기 위해 NextControl이라는 MainForm에 공용 속성을 설정했습니다. List 속성을 설정하여 선택할 수있는 모든 컨트롤에 대한 참조를 보유합니다. 이 메서드를 사용하면 대화 상자가 끝날 때까지 포커스가 다음 컨트롤에 설정되지 않으므로 ShowDialog가 제대로 작동합니다.

MainForm :

using System.Collections.Generic; 
using System.Windows.Forms; 

namespace Tabber 
{ 
    public partial class MainForm : Form 
    { 
     public MainForm() 
     { 
      InitializeComponent(); 
      ControlList = new List<Control>(new Control[] {button1, button2, button3, button4}); 
     } 

     private List<Control> ControlList { get; set; } 

     public Control NextControl { get; set; } 

     private void MainForm_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Tab) 
      { 
       using (var chooseDialog = new Chooser(this, ControlList)) 
       { 
        if (chooseDialog.ShowDialog() == DialogResult.OK) 
        { 
         if (NextControl != null) 
         { 
          NextControl.Focus(); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

선택기 :

using System.Collections.Generic; 
using System.Windows.Forms; 

namespace Tabber 
{ 
    public partial class Chooser : Form 
    { 
     public Chooser(MainForm sender, List<Control> controls) 
     { 
      Sender = sender; 
      InitializeComponent(); 

      foreach (Control control in controls) 
      { 
       listBox1.Items.Add(control); 
      } 
      listBox1.DisplayMember = "Name"; 
      listBox1.SetSelected(0, true); 
     } 

     private MainForm Sender { get; set; } 

     private void Chooser_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Tab) 
      { 
       if (listBox1.SelectedIndex == listBox1.Items.Count - 1) 
       { 
        listBox1.SetSelected(0, true); 
       } 
       else 
       { 
        listBox1.SetSelected(listBox1.SelectedIndex + 1, true); 
       } 
       e.Handled = true; 
      } 
     } 

     private void listBox1_KeyUp(object sender, KeyEventArgs e) 
     { 
      if (e.KeyCode == Keys.ControlKey) 
      { 
       Sender.NextControl = (Control) listBox1.SelectedItem; 
       DialogResult = DialogResult.OK; 
       Close(); 
      } 
     } 
    } 
} 

당신은 당신의 필요에 따라이를 수정할 수 있습니다. 그것은 나를 위해 초점을 바꿨습니다.

관련 문제