9 Stimmen

Was ist das für eine Kontrolle? ("Öffnen" Schaltfläche mit Dropdown)

En Open auf dem Dialogfeld "Datei öffnen", das in bestimmten Windows-Anwendungen verwendet wird, enthält einen Dropdown-Pfeil mit einer Liste zusätzlicher Optionen - nämlich Open With.. .

Open File Dialog

Ich habe dies nicht in jeder Windows-Anwendung gesehen, daher müssen Sie möglicherweise einige ausprobieren, um es zu erhalten, aber sowohl SQL Server Management Studio als auch Visual Studio 2017 zeigen die Schaltfläche auf diese Weise an, wenn Sie zum Menü gehen und wählen File -> Open -> File...

Ich möchte eine solche Schaltfläche mit einer integrierten Liste in einer meiner Anwendungen verwenden, aber ich kann das Steuerelement, das sie verwenden, nirgendwo in Visual Studio finden. Ich sollte klarstellen, dass ich nach dieser speziellen Schaltfläche suche, nicht nach dem gesamten Dialog. Hat jemand eine Idee?

7voto

Will Dean Punkte 38365

Ich habe die verschiebbare Suche in Spy++ (mit VS installiert) verwendet, um die Schaltfläche für geteiltes Öffnen im Datei-Öffnen-Dialog von VS zu untersuchen.

Dabei stellte sich heraus, dass es sich um eine gewöhnliche Windows-Schaltfläche mit einem Stil handelt, der BS_DEFSPLITBUTTON enthält. Das ist ein magisches Schlüsselwort, das Sie an einige interessante Orte bringt, darunter

http://www.codeplex.com/windowsformsaero/SourceControl/FileView.aspx?itemId=212902&changeSetId=9930

und hier

http://msdn.microsoft.com/en-us/library/bb775949.aspx#using_splits

Ich hoffe, das hilft Ihnen.

EDITAR:

Ich habe gerade versucht, dass Code von CodePlex und es tut eine geteilte Schaltfläche erstellen - aber Sie müssen sicherstellen, dass Sie die Schaltfläche FlatStyle auf "System" statt "Standard", die der Standard ist festgelegt haben. Ich habe nicht die Mühe gemacht, die Ereignisbehandlung Zeug für die Dropdown einhaken, aber das ist in der MSDN-Link abgedeckt, ich denke.

Natürlich ist dies nur für Vista (aber Aero muss nicht aktiviert sein, trotz des Namens auf Codeplex) - wenn Sie Unterstützung für frühere Betriebssysteme benötigen, müssen Sie es wieder selbst zeichnen.

5voto

David Vidmar Punkte 3002

Ich erinnerte mich daran, dass Ketarin hat eine solche Schaltfläche.

Verwendung von Reflektor Ich habe eine großartige Open-Source-Kontrolle namens wyDay.SplitButton . wyDay.SplitButton

4voto

Haydar Punkte 1272

Ich denke, was Sie suchen, wird toolStripSplitButton genannt. Sie ist nur in einem toolStrip verfügbar. Sie können jedoch einen toolStripContainer an einer beliebigen Stelle Ihres Formulars hinzufügen und dann den toolStrip und die toolStripSplitButton in Ihren Container einfügen.

Sie werden die Griffe nicht anzeigen wollen, also stellen Sie gripMargin = 0 ein. Sie können auch autosize=true einstellen, damit sich der Toolstrip an Ihre Schaltfläche anpasst. Die Schaltfläche wird wie eine normale Schaltfläche (mit Ausnahme des geteilten Teils) in Ihrem Formular aussehen.

2voto

Neil Neyman Punkte 2099

Ich habe nicht vertraut mit der Verwendung eines dieser, aber versuchen Sie die Suche msdn für splitbutton oder dropdownbutton. Ich denke, diese sind ähnlich wie das, wonach Sie suchen.

2voto

Nick Punkte 13044

Hier ist meine Implementierung einer geteilten Schaltfläche. Es zeichnet nicht den Pfeil, und der Fokus / unfocus Verhalten ist ein wenig anders.

Sowohl meine als auch die Originale beherrschen visuelle Stile und sehen mit Aero großartig aus.

Basierend auf http://wyday.com/splitbutton/

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
using System.Drawing;
using System.ComponentModel;
using System.Diagnostics;

// Original: http://blogs.msdn.com/jfoscoding/articles/491523.aspx
// Wyatt's fixes: http://wyday.com/splitbutton/
// Trimmed down and redone significantly from that version (Nick 5/6/08)
namespace DF
{
    public class SplitButton : Button
    {
        private ContextMenuStrip m_SplitMenu = null;
        private const int SplitSectionWidth = 14;
        private static int BorderSize = SystemInformation.Border3DSize.Width * 2;
        private bool mBlockClicks = false;
        private Timer mTimer;

        public SplitButton()
        {
            this.AutoSize = true;
            mTimer = new Timer();
            mTimer.Interval = 100;
            mTimer.Tick += new EventHandler(mTimer_Tick);
        }

        private void mTimer_Tick(object sender, EventArgs e)
        {
            mBlockClicks = false;
            mTimer.Stop();
        }

        #region Properties
        [DefaultValue(null)]
        public ContextMenuStrip SplitMenu
        {
            get
            {
                return m_SplitMenu;
            }
            set
            {
                if (m_SplitMenu != null)
                    m_SplitMenu.Closing -= 
                        new ToolStripDropDownClosingEventHandler(m_SplitMenu_Closing);

                m_SplitMenu = value;

                if (m_SplitMenu != null)
                    m_SplitMenu.Closing += 
                        new ToolStripDropDownClosingEventHandler(m_SplitMenu_Closing);
            }
        }

        private void m_SplitMenu_Closing(object sender, ToolStripDropDownClosingEventArgs e)
        {
            HideContextMenuStrip();
            // block click events for 0.5 sec to prevent re-showing the menu

        }

        private PushButtonState _state;
        private PushButtonState State
        {
            get
            {
                return _state;
            }
            set
            {
                if (!_state.Equals(value))
                {
                    _state = value;
                    Invalidate();
                }
            }
        }

        #endregion Properties

        protected override void OnEnabledChanged(EventArgs e)
        {
            if (Enabled)
                State = PushButtonState.Normal;
            else
                State = PushButtonState.Disabled;

            base.OnEnabledChanged(e);
        }

        protected override void OnMouseClick(MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;
            if (State.Equals(PushButtonState.Disabled))
                return;
            if (mBlockClicks)
                return;

            if (!State.Equals(PushButtonState.Pressed))
                ShowContextMenuStrip();
            else
                HideContextMenuStrip();
        }

        protected override void OnMouseEnter(EventArgs e)
        {
            if (!State.Equals(PushButtonState.Pressed) && !State.Equals(PushButtonState.Disabled))
            {
                State = PushButtonState.Hot;
            }
        }

        protected override void OnMouseLeave(EventArgs e)
        {
            if (!State.Equals(PushButtonState.Pressed) && !State.Equals(PushButtonState.Disabled))
            {
                if (Focused)
                {
                    State = PushButtonState.Default;
                }

                else
                {
                    State = PushButtonState.Normal;
                }
            }
        }

        protected override void OnPaint(PaintEventArgs pevent)
        {
            base.OnPaint(pevent);

            Graphics g = pevent.Graphics;
            Rectangle bounds = this.ClientRectangle;

            // draw the button background as according to the current state.
            if (State != PushButtonState.Pressed && IsDefault && !Application.RenderWithVisualStyles)
            {
                Rectangle backgroundBounds = bounds;
                backgroundBounds.Inflate(-1, -1);
                ButtonRenderer.DrawButton(g, backgroundBounds, State);

                // button renderer doesnt draw the black frame when themes are off =(
                g.DrawRectangle(SystemPens.WindowFrame, 0, 0, bounds.Width - 1, bounds.Height - 1);
            }
            else
            {
                ButtonRenderer.DrawButton(g, bounds, State);
            }

            StringFormat format = new StringFormat();
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;

            g.DrawString(Text, Font, SystemBrushes.ControlText, bounds, format);
        }

        private void ShowContextMenuStrip()
        {
            State = PushButtonState.Pressed;
            if (m_SplitMenu != null)
            {
                m_SplitMenu.Show(this, new Point(0, Height), ToolStripDropDownDirection.BelowRight);
            }
        }

        private void HideContextMenuStrip()
        {
            State = PushButtonState.Normal;
            m_SplitMenu.Hide();
            mBlockClicks = true;
            mTimer.Start();
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X