3

コントロールを使用してToolStripDropDown、カスタムComboBoxのようなコントロールのドロップダウン部分を実装しています。視覚的にアピールするためMaximumSizeに、ドロップダウンにを押し付け、その中のそれぞれの幅を手動で指定してToolStripButtonいます-結果は、それをアクティブにするコントロールと同じ幅のポップアップであり、高さの高さにキャップが付いていますドロップダウン部分の。

例(簡略化):

ToolStripDropDown dropDown = new ToolStripDropDown();
dropDown.MaximumSize = new Size(200, 100);
dropDown.RenderMode = ToolStripRenderMode.System;
dropDown.AutoSize = true;

for (int i = 0; i < 50; i++) {
    ToolStripButton dropDownItem = (ToolStripButton)dropDown.Items.Add("Item " + i);
    dropDownItem.AutoSize = false;
    dropDownItem.Size = new Size(200, 20);
}

dropDown.Show(owningControl, new Point(0, owningControl.Height - 1));

ご覧のとおり、ポップアップのサイズに制約がありますが、上下のスクロールボタンが表示されておらず、表示させる方法がないようです。ToolStripDropDownスクロールオフセットまたは特定のアイテムをビューにスクロールするメカニズム(EnsureVisible()onなど)に関しては、メソッドやプロパティが含まれていないようListViewItemです。

それでは、どのようにしてドロップダウンをスクロールさせることができますか?スクロールバー、スクロールボタン、さらにはマウスホイールなど、どのような方法でも十分です。

(ちなみに、私はドロップダウン部分にを使用して同様のコントロールを作成しようと何度も試みFormました-ポップアップがフォーカスを奪ったり、コントロールがクリックされたときにフォーカスを取得したりするのを防ぐために何十もの解決策を試しましたが、これは行き止まりのようです。また、を使用することも除外されましたToolStripControlHost。このホストコントロールは、それを開いたフォームからフォーカスを奪うことができます。)

4

2 に答える 2

3

ついにこれを割った。私はContextMenuStripToolStripDropDownMenu基本クラスでToolStripDropDownあるが提供できない自動スクロール動作が可能であることに気づきました。当初、これらの代替コントロールは通常広いマージンを追加するため、回避しました。ShowImageMarginこれは、およびを介して削除できますShowCheckMargin。これを行った後でも、小さな(約5px)マージンが残ります。DefaultPaddingこれは、プロパティをオーバーライドすることで削除できます。

public class MyDropDown : ToolStripDropDownMenu {

    protected override Padding DefaultPadding {
        get { return Padding.Empty; }
    }

    public MyDropDown() {
        ShowImageMargin = ShowCheckMargin = false;
        RenderMode = ToolStripRenderMode.System;
        MaximumSize = new Size(200, 150);
    }
}

// adding items and calling Show() remains the same as in the question

これにより、任意のタイプのToolStripアイテムを含むことができ、強制しMaximumSize、マージンがなく、最も重要なことに、フォーカスを盗むこともフォーカスを受け取ることもできないポップアップウィンドウが表示されます。

于 2010-10-29T17:55:44.043 に答える
1

これはあなたの宿敵です:

internal virtual bool RequiresScrollButtons
{
    get
    {
        return false;
    }
    set
    {
    }
}

これは内部的なものであり、オーバーライドすることはできません。フォーカスを盗む動作を修正することで、フォームを使用するアプローチを復活させることができます。これをフォームクラスに貼り付けます。

protected override bool ShowWithoutActivation
{
    get { return true; }
}
于 2010-10-29T14:41:11.703 に答える