Какое управление - это? (“Откройте” Button with Drop Down),

Open кнопка на открытом диалоговом окне файла, используемом в определенных приложениях Windows, включает стрелку выпадающего списка со списком дополнительных опций — а именно, Open With...

Open File Dialog

Я не видел это в каждом Приложении Windows, таким образом, Вам, вероятно, придется попробовать некоторых для получения его, но Studio управления SQL Server и Visual Studio, 2017 и покажет кнопку, что путь, если Вы войдете в меню и выберете File->Open->File...

Я хочу использовать кнопку как это со встроенным списком в одном из моих приложений, но я не могу найти управление, которое они используют где угодно в Visual Studio. Я должен разъяснить, что ищу ту определенную кнопку, не все диалоговое окно. Какие-либо мысли?

9
задан Joel Coehoorn 22 September 2019 в 21:33
поделиться

7 ответов

Я использовал перемещаемый поиск в Шпионе ++ (установленный с VS) для рассмотрения взломанной кнопки на открытом для файла диалоговом окне VS.

Это показало, что это - обычная кнопка окон со стилем, который включает BS_DEFSPLITBUTTON. Это - волшебное ключевое слово, которое получает Вас к некоторым интересным местам, включая

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

и здесь

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

Надежда это помогает Вам.

Править:

Я на самом деле только что попробовал тот код от CodePlex, и он действительно создает кнопку разделения - но действительно необходимо удостовериться, что Вы установили FlatStyle кнопки на 'Систему', а не 'Стандарт', который является значением по умолчанию. Я не побеспокоил к сцеплению материал обработки событий для выпадающего, но это охвачено в ссылке MSDN, я думаю.

Конечно, это только для Vista (но не нуждается Аэро, включил, несмотря на имя на codeplex) - если Вам будет нужна более ранняя поддержка ОС, то Вы вернетесь к рисованию его сами.

7
ответ дан 4 December 2019 в 09:39
поделиться

Я не думаю, что существует встроенное управление, которое может сделать это в.NET. Я ввожу по абсолютному адресу вокруг в документации MSDN для стандартного Windows Button control, но не похоже, что это там.

Я действительно находил статью Code Project с пользовательской реализацией; это могло бы помочь немногому.

1
ответ дан 4 December 2019 в 09:39
поделиться

Так как я нашел управление в самом Windows, я надеялся уже найти это встроенным где-нибудь, таким образом, я ничего не должен был добавлять к своей кодовой базе для использования его. Но кнопка разделения в этой ссылке (найденный через предложение MSDN) выглядит довольно многообещающей.

Я попробую его позже сам, но я не знаю, как хорошо это обработает визуальные стили.

0
ответ дан 4 December 2019 в 09:39
поделиться

Вот моя реализация кнопки разделения. Это не привлекает стрелку, и поведение фокуса/нефокуса немного отличается.

И мой и оригиналы обрабатывают визуальные стили и выглядят большими с Аэро.

На основе 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();
        }
    }
}
2
ответ дан 4 December 2019 в 09:39
поделиться

Я не имею знакомый с использованием или их, но пытаюсь искать MSDN splitbutton или dropdownbutton. Я думаю, что это подобно тому, что Вы ищете.

2
ответ дан 4 December 2019 в 09:39
поделиться

Я думаю, что Вы ищете, назван toolStripSplitButton. Это только доступно в toolStrip. Но можно добавить toolStripContainer где угодно на форме и затем поместить toolStrip и toolStripSplitButton в контейнере.

Вы не захотите показывать власти, таким образом, Вы захотите установить свой gripMargin = 0. Можно также установить autosize=true так, чтобы toolstrip соответствовал кнопке. Кнопка будет просто похожа на нормальную кнопку (за исключением части разделения) на Вашей форме.

4
ответ дан 4 December 2019 в 09:39
поделиться

Я вспомнил, что Кетарин имеет такую ​​кнопку.

Используя Reflector , я нашел отличный элемент управления с открытым исходным кодом под названием wyDay.SplitButton . wyDay.SplitButton

6
ответ дан 4 December 2019 в 09:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: