固定サイズのツールストリップドロップダウンでスクロールする方法

StackOverflow https://stackoverflow.com/questions/4051217

  •  27-09-2019
  •  | 
  •  

質問

私はaを使用しています ToolStripDropDown カスタムコンボボックスのようなコントロールのドロップダウン部分を実装するための制御。視覚的に魅力的であるために、私は 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() の上 ListViewItem).

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

(ちなみに、私は何度も同様のコントロールを作成しようとしました Form ドロップダウン部分の場合 - ポップアップが焦点を盗んだり、コントロールがクリックされたときにフォーカスを獲得したりするのを防ぐために多数のソリューションを試みていますが、これは行き止まりのようです。私も使用を除外しました ToolStripControlHost, 、ホストされたコントロールは、それを開いたフォームから焦点を奪うことができます。)

役に立ちましたか?

解決

最後にこれを割った。それは私に起こりました ContextMenuStripToolStripDropDownMenu 基本クラスが自動スクロールする動作が可能です。 ToolStripDropDown, 、提供できません。当初、これらの代替制御は通常広いマージンを追加するため、これらの代替コントロールを避けました。これを介して削除できます ShowImageMarginShowCheckMargin. 。これを行った後でも、小さな(約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

これにより、あらゆるタイプのツールストリップアイテムを含むことができるポップアップウィンドウが作成されます。 MaximumSize, 、マージンがなく、最も重要なことには、焦点を盗むことができず、フォーカスを受け取ることができません。

他のヒント

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

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

それは内部であり、あなたはそれを無効にすることはできません。フォーカス盗む動作を修正することにより、フォームを使用するアプローチを復活させることができます。これをフォームクラスに貼り付けます。

protected override bool ShowWithoutActivation
{
    get { return true; }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top