5

ToolStripDropDownButtonを備えたToolStripがあります。これにより、DateTimePickerを使用してUserControlがポップアップ表示されます。カレンダーの一番上の数字(緑色)をクリックすると、すべてが正常に機能します(ユーザーコントロールは開いたままです)。低い日付(赤)の1つをクリックすると、ToolStripDropDownが閉じ、アプリケーションがフォーカスを失います。これにより、ユーザーはドロップダウンを再度開くためにダブルクリックする必要があります(1回はアプリケーションのフォーカスを合わせ、もう1回はドロップダウンを開きます)。

これは、カレンダーの日付がユーザーコントロールの上にない場合に発生します。ご覧のとおり、ユーザーコントロールは「緑」の日付で停止します。

これが明確であることを願っています。これは非常に単純なプロジェクトで発生するため、これはWindowsのバグのようです。誰かがこの問題を見たことがありますか?これに対する修正はありますか?

ここに画像の説明を入力してください

[アップデート]

ドロップダウンでも同じことがわかります。

ここに画像の説明を入力してください

ユーザーコントロールが非常に大きい場合は発生しません。

ここに画像の説明を入力してください

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    Dim uc As New UserControl1
    Dim cms As New ContextMenuStrip()
    cms.Items.Add(New ToolStripControlHost(uc))
    ToolStripButton1.DropDown = cms

End Sub
4

3 に答える 3

4

機能であり、バグではありません。コントロールは、ユーザーがドロップダウンの外側をクリックしたことを認識して、ドロップダウンを自動的に閉じることができるようにする必要があります。これは、CaptureプロパティによってWinformsで公開される「マウスキャプチャ」で行われます。マウスをキャプチャすると、マウスがコントロールウィンドウ内に配置されなくなった場合でも、マウスメッセージがコントロールに送信されます。

おそらく、今何が起こっているのかは明らかです。実際にはカレンダーをクリックしていません。ドロップダウンが表示されると、コントロールがマウスをキャプチャします。クリックはToolStripDropDownにリダイレクトされます。これは、「赤い領域」をクリックしたときにマウスがドロップダウン内にないことを確認し、ドロップダウンウィンドウを閉じます。

このようなドロップダウンは、実際には単純なアイテムにのみ適しています。その中に、DateTimePickerやComboBoxなどのトップレベルウィンドウを作成するコントロールを配置することは、サポートされているシナリオではありません。

于 2012-12-17T20:00:34.203 に答える
2

AutoCloseを切り替えることで、同様の方法でこれを解決しました。私はコードを投稿すると思いました:

    public class ToolStripDropDownDateTimePicker : DateTimePicker
{
    private bool savedAutoClose;

    /// <summary>
    /// Creates a new ToolStripDropDownDateTimePicker.
    /// </summary>
    public ToolStripDropDownDateTimePicker()
    {

    }

    protected override void OnCloseUp(EventArgs e)
    {
        if (this.Parent != null)
        {
            var dropDownHost = this.Parent.Parent as ToolStripDropDown; // recursive instead?
            if (dropDownHost != null)
                dropDownHost.AutoClose = savedAutoClose; // restore the parent's AutoClose preference
        }

        base.OnCloseUp(e);
    }

    protected override void OnDropDown(EventArgs e)
    {
        if (this.Parent != null)
        {
            var dropDownHost = this.Parent.Parent as ToolStripDropDown; // recursive instead?
            if (dropDownHost != null)
            {
                savedAutoClose = dropDownHost.AutoClose;
                // ensure that our parent doesn't close while the calendar is open
                dropDownHost.AutoClose = false;
            }
        }
        base.OnDropDown(e);
    }
}
于 2014-05-22T12:23:05.847 に答える
1

アプリケーションの動作を変更できなかったため、コントロールのイベントに応じて、フォームのAutoCloseをFalseまたはTrueに設定することにしました。

于 2012-12-18T20:05:41.020 に答える