5

同じツールストリップ パネル内の別のツールストリップを使用してツールストリップを左にドラッグすると (おそらくコーナーに配置するためだけに)、ドラッグしているツールストリップは下に移動したかのように「新しい」行にジャンプします。説明するのはかなり難しいので、ここにいくつかの図を示します。

図 A: ツールストリップを左に移動すると、「誤って」左に移動しすぎました (ユーザーが簡単に実行できる数十ピクセルだけです)。

図 B: ドラッグされたツールストリップが 1 行下にドロップされます。

ここに画像の説明を入力

この新しい行が「作成」されないようにするにはどうすればよいですか? 最後の手段として、どのような状況でも新しい行が作成されないようにしていただければ幸いです (例: ユーザーが下にドラッグして新しい行を作成しようとした場合)。

私は LayoutStyle を試してみましたが、役に立ちませんでした。

4

3 に答える 3

1

Winforms のツールストリップ クラスはかなり風変わりです。それらは .NET 2.0 でリリースされ、その後すぐに Winforms チームは解散しました。多くのチーム メンバーが WPF プロジェクトに移行しました。その結果、これらの癖は解決されませんでした。これについて自分でできることはほとんどありません。ほとんどのツールストリップ コードはロックされており、動作をオーバーライドする方法はありません。それもかなり多いので、書き直すのも現実的ではありません。

行が縦に大きくなるのを防ぐことができます。これを行うには、上部のツールストリップ コンテンツ パネルで MaximumSize プロパティを設定します。

    public Form1() {
        InitializeComponent();
        toolStripContainer1.TopToolStripPanel.MaximumSize =
            new Size(0, toolStrip1.Height);
    }

しかし、これをいじってみると、ツールストリップが完全に消えてしまうことがわかるでしょう。そのための明確な修正はありません。

これは正確には実際の問題ではないことに注意してください。ツールストリップの場所はユーザーの選択であり、決して助けてはなりません。ユーザーがそれらを論理的な方法で配置することを期待できます。

于 2013-03-04T01:24:54.857 に答える
1

OnMouseLeave でレイアウトを一時停止し、OnMouseEnter/OnMouseUp/etc を再度有効にしたらどうですか?

public class ToolStripContainerFix : ToolStripContainer
{
    public ToolStripContainerFix()
        : base()
    {
        this.TopToolStripPanel.MouseLeave += TopToolStripPanel_MouseLeave;
        this.TopToolStripPanel.MouseEnter += TopToolStripPanel_MouseEnter;
    }

    void TopToolStripPanel_MouseLeave(object sender, EventArgs e)
    {
        this.TopToolStripPanel.SuspendLayout();
    }

    void TopToolStripPanel_MouseEnter(object sender, EventArgs e)
    {
        this.TopToolStripPanel.ResumeLayout();
    }
}

コントロール自体ではなく、フォームの外側をチェックするように、これをいじる必要があります...そのようにして、意図したときに新しい行を作成できるようにします。

于 2013-03-03T22:50:32.810 に答える
1

これを行うには、おそらくいくつかの方法があります。いくつか試してみましたが、どれも完璧ではありません。私が見つけた最も簡単な方法は、ハンスが言及したように ToolStripPanel の最大サイズを設定し、ToolStrip をサブクラス化してオーバーライドする (またはサブクラス化ではなくOnLocationChangedイベントハンドラーを割り当てることですが、ハンドラーを割り当てる必要があります)。LocationChanged各 ToolStrip に)。

public class ToolStripEx : ToolStrip
{
    protected override void OnLocationChanged(EventArgs e)
    {
        if (this.Location.Y >= this.Parent.MaximumSize.Height)
        {
            this.Location = new Point(this.Location.X, 0);
        }
        else
        {
            base.OnLocationChanged(e);
        }           
    }
}


注:これにより、ToolStrip を下にドラッグしようとすると、場所が既に変更された後にリセットされるため、マウスが前後にジャンプするため、基本的に下に移動し、すぐに元に戻ります。

また、特に ToolStrip を意図的に新しい行に配置しようとしている場合は、これがユーザーにとって煩わしい可能性があることにも言及する価値があるため、これを行うことはお勧めしません。しかし、あなたが尋ねたので、そこにあります。

完全な手順とコードで更新します。

新しい空の Windows フォーム プロジェクトを作成しました。ソリューションに新しいファイルを追加しましたToolStripEx.cs。これがその内容です。

他のパネルとそのパネルについて更新Orientation

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public class ToolStripEx : ToolStrip
    {
        protected override void OnLocationChanged(EventArgs e)
        {
            if (this.Parent is ToolStripPanel)
            {
                ToolStripPanel parent = this.Parent as ToolStripPanel;

                if (parent.Orientation == Orientation.Horizontal)
                {
                    if (this.Location.Y != 0)
                    {
                        this.Location = new Point(this.Location.X, 0);
                        return;
                    }
                }
                else if (parent.Orientation == Orientation.Vertical)
                {
                    if (this.Location.X != 0)
                    {
                        this.Location = new Point(0, this.Location.Y);
                        return;
                    }
                }
            }
            base.OnLocationChanged(e);
        }
    }
}


次に、ToolStripExクラスがツールボックスに表示されるようにソリューションを構築しました。

ToolStripContainer次に、ツールボックスからフォームにレギュラーを配置し、 に設定DockFill、色などを設定します。

次にToolStripEx、ツールボックスからTopToolStripPanel. 色やレンダラーなどを設定しました。

これはForm1.cs次のようになります。

他の最大サイズを設定するように更新

using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.toolStripContainer1.TopToolStripPanel.MaximumSize = new Size(0, toolStripEx1.Height);
            this.toolStripContainer1.LeftToolStripPanel.MaximumSize = new Size(toolStripEx1.Height, 0);
            this.toolStripContainer1.BottomToolStripPanel.MaximumSize = new Size(0, toolStripEx1.Height);
            this.toolStripContainer1.RightToolStripPanel.MaximumSize = new Size(toolStripEx1.Height, 0);
        }
    }
}


Orientation: このコードは、どのパネルも行 (またはofがある場合は列Orientation.Vertical) を拡張できないようにします。サイド パネルを拡張できるようにする場合は、最大サイズを設定せず、else if parent.Orientation == Orientation.Verticalセクションを削除してください。

それだけのはずです。これを実行したところ、移動しても両方のToolStripExs が消えませんでした。

Hans が言ったように、このToolStripクラスはかなり風変わりであり、ニーズを念頭に置いてゼロから独自のコントロールを開発しない限り、問題に対するほとんどの解決策は完璧ではありません。

何らかの理由でToolStripContainerクラスを拡張する必要がある場合は、新しいクラスとは別にしてToolStripExください。ToolStripネストされたクラスが原因で、クラスではなく通常のクラスを引き続き使用していると思われますToolStripEx

もう 1 つの更新 - マウスのジャンプの修正: マウス カーソルの問題を解決しようと実験していたときに、偶然これを見つけました。ToolStripExこれをクラスに追加します。

protected override void OnBeginDrag(EventArgs e)
{
    //base.OnBeginDrag(e);
}

奇妙なことに、パネルの外にドラッグされることに対するツールストリップの抵抗が大幅に減少するようです。これが機能する理由については詳しく調べていませんが、ToolStrip は基本的なドラッグ/ドロップ機能を使用せずに独自のドラッグ動作を実装しているようでOnBeginDragDrop、ToolStrip をオーバーライドすることでカスタム動作を排他的に使用しているため、マウスをドラッグするときにマウスの動作がより適切になります。 .

于 2013-03-05T06:34:46.733 に答える