Pergunta

O botão "Abrir" na caixa de diálogo abrir arquivo utilizado em algumas aplicações do windows inclui uma seta de lista pendente com uma lista de opções adicionais -- ou seja, "Abrir com..".

Eu ainda não vi isso em cada aplicativo do windows, assim, você pode ter que tentar algumas para obtê-lo, mas o SQL Server Management Studio e Visual Studio 2005 irá mostrar o botão de maneira que, se você ir para o menu e escolha Arquivo->Abrir->Do Ficheiro...

Eu quero usar um botão como este com um built-in lista em um dos meus aplicativos, mas eu não consigo encontrar o controle que eles estão usando em qualquer lugar no visual studio.Devo esclarecer que eu estou olhando para o botão específico, e não a todo o diálogo.Quaisquer pensamentos?

Foi útil?

Solução

Eu usei o arrastáveis de pesquisa em Spy++ (instalado com o VS) para olhar para a divisão botão abrir na janela de abertura de ficheiros de VS.

Isso revela que ele é um ordinário botão do windows com um estilo que inclui BS_DEFSPLITBUTTON.Essa é uma magia de palavras-chave, que o leva a alguns lugares interessantes, incluindo

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

e aqui

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

Espero que isso ajude você.

EDITAR:

Eu realmente tentei só que o código do CodePlex e ele não cria um botão dividir - mas você tem que certificar-se de que você defina o botão de FlatStyle para o 'Sistema' em vez de 'Padrão', que é o padrão.Eu não tenho incomodado gancho-up evento de manuseio de material para o menu drop-down, mas que é coberto na MSDN link, eu acho.

Claro, esta é Vista apenas (mas não precisa Aero habilitado, apesar do nome, no codeplex) - se você precisa anteriores suporte do sistema operacional, você estará de volta ao desenho de si mesmo.

Outras dicas

Lembrei-me de que Ketarin tem um botão como esse.

Usando Refletor Achei ótimo o open source de controle de chamada wyDay.SplitButton. wyDay.SplitButton

Eu acho que o que você está procurando é chamado de um toolStripSplitButton.Ele só está disponível em uma barra de ferramentas.Mas você pode adicionar um toolStripContainer em qualquer lugar no formulário e, em seguida, coloque a barra de ferramentas e toolStripSplitButton dentro de seu recipiente.

Você não quer mostrar o apertos de modo que você vai querer definir o seu gripMargin = 0.Você também pode configurar o autosize=true para que a barra de ferramentas está de acordo com o seu botão.O botão só olhar como um botão normal (exceto para a parte dividida) em seu formulário.

Eu não familiarizado com o uso de qualquer um destes, mas tente procurar msdn para splitbutton ou dropdownbutton.Eu acho que esses são semelhantes ao que você está procurando.

Aqui está o meu botão de divisão de implementação.Ele não desenhar a seta, e o foco/unfocus comportamento é um pouco diferente.

Ambas as minas e os originais lidar com estilos visuais e olhar grande com o Aero.

Com base no 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();
        }
    }
}

Eu não acho que há um controle interno que pode fazer isso .LÍQUIDA.Eu estou bisbilhotando na documentação do MSDN para o padrão do Windows, o Botão de controlo, mas não parece que ele está lá.

Eu fiz encontrar um Projeto de código artigo com uma implementação personalizada;isso pode ajudar um pouco.

Desde que encontrei o controle no próprio Windows, eu estava esperando encontrar built-in em algum lugar já, então eu não tenho que adicionar qualquer coisa para a minha base de código para usá-lo.Mas o botão de divisão no este link (encontrado através do msdn sugestão) parece muito promissor.

Eu vou tentar mais tarde me, mas eu não sei bem como ele irá lidar com estilos visuais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top