1

テキストボックスまたはリストボックスがフォーカスされている場合にのみリストボックスが表示されるようにするテキストボックスとリストボックスのセットアップがあります。まず、リストボックスは非表示になります。次に、テキストボックスがフォーカスされると、リストボックスが表示されます。いずれかがフォーカスを失い、どちらもフォーカスを受け取っていない場合にのみ、リストボックスが再び非表示になります。したがって、私が達成したいのは、次のことが常に真であることです。

listBox.Visible = textBox.Focused || listBox.Focused

私のソリューションでは、テキストボックスおよび/またはリストボックスを標準タイプの特殊化にすることができます(これがソリューションを簡素化する場合)。

コントロールの LostFocus と GotFocus の両方のイベントをリッスンして、リストボックスの可視性を設定しようとしました。ただし、テキストボックスがフォーカスを失ったときにリストボックスを非表示にするため、リストボックスで GotFocus イベントが呼び出されることはありません。

これを達成する方法について誰か提案がありますか? 私のバックアップ計画 (私は嫌いです) は、一方がフォーカスを失ったときにタイマーを開始し、もう一方がフォーカスを取得したときにタイマーを停止することです。したがって、それを達成するための「よりクリーンな」方法があれば大歓迎です;)

編集: .NET WinForms カスタム コントロールとして使用するためにこれを開発しています。

編集2:

どうも自分のことをうまく説明できていないようです。そこで、私が達成したいことをより明確に説明しようと思います。

新しいタイプの TextBox を作成しています (数年前に作成した既存のタイプの TextBox を継承しています)。TextBox は現在、オブジェクトの汎用コレクション (IList を実装するサブタイプを含む) として機能しています。TextBox は、一連の基準に基づいてコレクション内の要素のサブセットを表示する ListBox を定義します。TextBox が親コントロールに追加されると、ListBox も追加されます。したがって、この 2 つは、コレクション内の要素を検索するようなセットアップとして機能します。入力を開始するとブラウザが候補を表示するのと同じようなものです。

両方のコントロールを含む UserControl の代わりにこの設定を使用しています。これは、後者の場合、ユーザー コントロールが両方のコントロールのサイズになるか、(サイズが TextBox と一致する場合) ListBox が非表示になるためです。

このコントロールが追加されたフォーム内のすべてのコントロールで、GotFocus または Enter イベントを処理することを選択できることに気付きました。これは私が考えた非常に簡単なアプローチですが、フォーム内の他のすべてのコントロールをリッスンしないコントロールを作成することを強く望んでいます。

これが明確になることを願っています。

4

2 に答える 2

0

すべてのコントロール Control_Enter イベントを集中型として実装し、送信者オブジェクトがテキストボックスまたはリストボックスであるかどうかを確認すると、リストボックスが表示され、それ以外の場合は非表示になります。

このような

this.button1.Enter += new System.EventHandler(this.Control_Enter);
   this.textBox1.Enter += new System.EventHandler(this.Control_Enter);
   this.listBox1.Enter += new System.EventHandler(this.Control_Enter);

private void Control_Enter(object sender, EventArgs e)
    {
        Control obj = (Control)sender;
        if (obj.Name == "textBox1" || obj.Name == "listBox1")
        {
            listBox1.Visible = true;
        }
        else
        {
            listBox1.Visible = false;
        }
    }

コントロールタブのインデックスを割り当てることを忘れないでください

于 2012-10-11T08:58:27.900 に答える
0

できることは、フォーム上の他のすべてのコントロールに Enterイベント ハンドラーを追加することです。

private void OtherControls_Enter(object sender, EventArgs e)
{
  listBox.Visible = false;
}

編集:
例は WinForms 用ですが、WPF でも動作するはずです。

カスタム コントロールに のみが含まれてTextBoxおりListBox、イベントを に追加してを可視TextBoxに設定する場合:ListBox

private void textBox1_Enter(object sender, EventArgs e)
{
  listBox1.Visible = true;
}

他のコントロールがある場合は、それらにOtherControls_Enterイベント ハンドラーを追加します。

Leaveカスタム コントロールのイベントでは、次のようなものを追加します。

private void userControl11_Leave(object sender, EventArgs e)
{
  userControl11.Controls["listbox1"].Visible = false;
}

編集 2:さらに良いのは、カスタム コントロール内の from
を公開することです。ListBox

public ListBox TheListBox { get { return listBox1; } }

その後:

private void userControl11_Leave(object sender, EventArgs e)
{
  userControl11.TheListBox.Visible = false;
}
于 2012-10-11T08:36:02.693 に答える