Frage

Die Schaltfläche „Öffnen“ im Dialogfeld „Datei öffnen“, die in bestimmten Windows-Anwendungen verwendet wird, enthält einen Dropdown-Pfeil mit einer Liste zusätzlicher Optionen – nämlich „Öffnen mit …“.

Ich habe dies nicht in jeder Windows-Anwendung gesehen, daher müssen Sie möglicherweise einige ausprobieren, um es zu erhalten, aber SQL Server Management Studio und Visual Studio 2005 zeigen die Schaltfläche beide auf diese Weise an, wenn Sie zum Menü gehen und auswählen Datei->Öffnen->Datei...

Ich möchte eine Schaltfläche wie diese mit einer integrierten Liste in einer meiner Anwendungen verwenden, kann das von ihnen verwendete Steuerelement jedoch nirgendwo in Visual Studio finden.Ich sollte klarstellen, dass ich nach dieser bestimmten Schaltfläche suche, nicht nach dem gesamten Dialog.Irgendwelche Gedanken?

War es hilfreich?

Lösung

Ich habe die ziehbare Suche in Spy++ (mit VS installiert) verwendet, um mir die Schaltfläche „Geteiltes Öffnen“ im Dialogfeld „Datei öffnen“ von VS anzusehen.

Dies ergab, 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 zu einigen interessanten Orten führt, 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 dir.

BEARBEITEN:

Ich habe diesen Code tatsächlich gerade von CodePlex ausprobiert und er erstellt tatsächlich eine geteilte Schaltfläche. Sie müssen jedoch sicherstellen, dass Sie den FlatStyle der Schaltfläche auf „System“ und nicht auf „Standard“ eingestellt haben, was die Standardeinstellung ist.Ich habe mir nicht die Mühe gemacht, das Event-Handling-Material für das Dropdown-Menü einzubinden, aber das wird, glaube ich, im MSDN-Link behandelt.

Dies gilt natürlich nur für Vista (aber es muss nicht Aero aktiviert sein, trotz des Namens auf Codeplex) – wenn Sie frühere Betriebssystemunterstützung benötigen, können Sie es wieder selbst zeichnen.

Andere Tipps

Daran habe ich mich erinnert Ketarin hat so einen Knopf.

Benutzen Reflektor Ich habe eine großartige Open-Source-Steuerung namens gefunden wyDay.SplitButton. wyDay.SplitButton

Ich denke, was Sie suchen, nennt sich „toolStripSplitButton“.Es ist nur in einem ToolStrip verfügbar.Sie können jedoch an einer beliebigen Stelle in Ihrem Formular einen ToolStripContainer hinzufügen und dann den ToolStrip und den ToolStripSplitButton in Ihren Container einfügen.

Da Sie die Griffe nicht anzeigen möchten, sollten Sie gripMargin = 0 festlegen.Sie können auch autosize=true festlegen, damit der Toolstrip Ihrer Schaltfläche entspricht.Die Schaltfläche sieht in Ihrem Formular einfach wie eine normale Schaltfläche aus (mit Ausnahme des geteilten Teils).

Ich bin mit der Verwendung von beidem nicht vertraut, aber versuchen Sie, msdn nach „splitbutton“ oder „dropdownbutton“ zu durchsuchen.Ich denke, das ähnelt dem, was Sie suchen.

Hier ist meine Split-Button-Implementierung.Der Pfeil wird nicht gezeichnet und das Fokussieren/Unfokussieren-Verhalten ist etwas anders.

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

Bezogen 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();
        }
    }
}

Ich glaube nicht, dass es in .NET ein integriertes Steuerelement gibt, das dies kann.Ich stöbere in der MSDN-Dokumentation nach dem Standard-Windows-Button-Steuerelement, aber es sieht nicht so aus, als ob es dort wäre.

Ich habe einen gefunden Artikel zum Code-Projekt mit einer benutzerdefinierten Implementierung;das könnte ein wenig helfen.

Da ich das Steuerelement in Windows selbst gefunden habe, hoffte ich, es irgendwo bereits integriert zu finden, sodass ich meiner Codebasis nichts hinzufügen musste, um es zu verwenden.Aber der Split-Button bei dieser Link (über den MSDN-Vorschlag gefunden) sieht ziemlich vielversprechend aus.

Ich werde es später selbst ausprobieren, aber ich weiß nicht, wie gut es mit visuellen Stilen umgehen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top