Вы можете получить один элемент, запустив
document.querySelector('.myElement').style.size = '100px';
, но он будет работать для первого элемента с классом .myElement.
Если вы хотите применить это для всех элементы с классом я предлагаю вам использовать
document.querySelectorAll('.myElement').forEach(function(element) {
element.style.size = '100px';
});
Вы можете показать ContextMenuStrip в событии клика:
private void button1_Click(object sender, EventArgs e) {
contextMenuStrip1.Show(button1, new Point(0, button1.Height));
}
Чтобы сделать свое собственное определение, показывать ли меню выше или ниже кнопки, вы можете попробовать использовать этот код, который измеряет меню и определяет, будет ли он частично вне экрана:
private void button1_Click(object sender, EventArgs e) {
Point screenPoint = button1.PointToScreen(new Point(button1.Left, button1.Bottom));
if (screenPoint.Y + contextMenuStrip1.Size.Height > Screen.PrimaryScreen.WorkingArea.Height) {
contextMenuStrip1.Show(button1, new Point(0, -contextMenuStrip1.Size.Height));
} else {
contextMenuStrip1.Show(button1, new Point(0, button1.Height));
}
}
Я тоже занимался этой проблемой и нашел очень простое решение (хотя и немного грязно-взломанное): поместите ComboBox
под Button
, чтобы он показывал стрелку вниз рядом с кнопкой.
Затем используйте SelectedIndexChanged
для ComboBox
, чтобы изменить поведение Button
или сделать то, что вы хотите сделать немедленно.
TabStop
на False
на ComboBox
и нажмите клавишу со стрелкой вниз на Button
?
– Bart Friederichs
12 April 2017 в 15:25
Показывать контекстное меню под кнопкой при нажатии.
имеет правую сторону стрелки вниз, и вы можете установить ее из конструктора:
[/g0]
С ShowMenuUnderCursor:
[/g1]
Класс MenuButton:
public class MenuButton : Button
{
[DefaultValue(null)]
public ContextMenuStrip Menu { get; set; }
[DefaultValue(false)]
public bool ShowMenuUnderCursor { get; set; }
protected override void OnMouseDown(MouseEventArgs mevent)
{
base.OnMouseDown(mevent);
if (Menu != null && mevent.Button == MouseButtons.Left)
{
Point menuLocation;
if (ShowMenuUnderCursor)
{
menuLocation = mevent.Location;
}
else
{
menuLocation = new Point(0, Height);
}
Menu.Show(this, menuLocation);
}
}
protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);
if (Menu != null)
{
int arrowX = ClientRectangle.Width - 14;
int arrowY = ClientRectangle.Height / 2 - 1;
Brush brush = Enabled ? SystemBrushes.ControlText : SystemBrushes.ButtonShadow;
Point[] arrows = new Point[] { new Point(arrowX, arrowY), new Point(arrowX + 7, arrowY), new Point(arrowX + 3, arrowY + 4) };
pevent.Graphics.FillPolygon(brush, arrows);
}
}
}
Menu
всегда null
, независимо от того, как установить значение свойства ContextMenuStrip
?
– Alex Jolig
2 November 2015 в 06:16
Menu
, а не свойство ContextMenuStrip
. myButton.Menu = New ContextMenuStrip
.. вы, вероятно, делаете myButton.ContextMenuStrip = New ContextMenuStrip
– user1003916
31 May 2016 в 16:32
OnPaint
на кнопке вместо наследования с Button
, не забудьте использовать размеры кнопки, а не ClientRectangle
. Вот так: Button btnSender = (Button)sender; int arrowX = btnSender.Width - 14; int arrowY = btnSender.Height / 2 - 1;
– Andrew
24 December 2016 в 02:49
Класс MenuButton Jaex выше для меня был идеальным. Я добавил логику ниже в OnMouseDown, чтобы контекстное меню отображалось только в том случае, если я нажал на стрелку. Если щелкнуть по большей части, произойдет обычное событие щелчка. Разрешено действие щелчка по умолчанию.
if (Menu != null && mevent.Button == MouseButtons.Left)
{
if (mevent.Location.X >= this.Width - 14)
{
System.Drawing.Point menuLocation;
if (ShowMenuUnderCursor)
{
menuLocation = mevent.Location;
}
else
{
menuLocation = new System.Drawing.Point(0, Height);
}
Menu.Show(this, menuLocation);
}
}
Думал, что это может быть полезно кому-то. Спасибо Jaex
Самый простой вариант - использовать ToolStripDropDownButton в незакрепленном ToolStrip, который отображает только одну кнопку. Затем вы можете добавить к нему подпозиции и т. Д. Чтобы сделать это: - перетащите панель инструментов на свой элемент управления / форму - используйте вспомогательный элемент макета для добавления DropDownButton - установите GripStyle в Hidden - установите Dock в None
В результате создается отдельная кнопка в стиле панели инструментов, которая поддерживает описанное выше раскрывающееся поведение.
Легко мы могли это сделать. это может помочь:)
ContextMenuStrip contextMenuStrip1 = new ContextMenuStrip();
private void button1_Click(object sender, EventArgs e)
{
contextMenuStrip1.Items.Clear();
contextMenuStrip1.Items.Add("item1");
contextMenuStrip1.Items.Add("item2");
contextMenuStrip1.Show(button1, new Point(0, button1.Height));
}
private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
if (e.ClickedItem.Text == "item1")
{
MessageBox.Show(e.ClickedItem.Text);
}
}
У Infragistics есть WinDropDownButton: http://help.infragistics.com/Help/NetAdvantage/WinForms/2012.1/CLR2.0/html/WinDropDownButton_About_WinDropDownButton.html
So он определенно существует, однако вы не можете искать платный сторонний элемент управления.
Расширение @Jaex answer немного, чтобы разрешить линию разделителя, условный чертеж стрелки, если ничего не настроено, и отдельное событие клика для основного тела кнопки и стрелки меню.
Следует отметить, что для лучшего выравнивания вы можете установить button.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
Вот мое небольшое улучшение
public class SplitButton : Button
{
[DefaultValue(null), Browsable(true),
DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public ContextMenuStrip Menu { get; set; }
[DefaultValue(20), Browsable(true),
DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public int SplitWidth { get; set; }
public SplitButton()
{
SplitWidth = 20;
}
protected override void OnMouseDown(MouseEventArgs mevent)
{
var splitRect = new Rectangle(this.Width - this.SplitWidth, 0, this.SplitWidth, this.Height);
// Figure out if the button click was on the button itself or the menu split
if (Menu != null &&
mevent.Button == MouseButtons.Left &&
splitRect.Contains(mevent.Location) )
{
Menu.Show(this, 0, this.Height); // Shows menu under button
//Menu.Show(this, mevent.Location); // Shows menu at click location
}
else
{
base.OnMouseDown(mevent);
}
}
protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);
if (this.Menu != null && this.SplitWidth > 0)
{
// Draw the arrow glyph on the right side of the button
int arrowX = ClientRectangle.Width - 14;
int arrowY = ClientRectangle.Height / 2 - 1;
var arrowBrush = Enabled ? SystemBrushes.ControlText : SystemBrushes.ButtonShadow;
var arrows = new[] { new Point(arrowX, arrowY), new Point(arrowX + 7, arrowY), new Point(arrowX + 3, arrowY + 4) };
pevent.Graphics.FillPolygon(arrowBrush, arrows);
// Draw a dashed separator on the left of the arrow
int lineX = ClientRectangle.Width - this.SplitWidth;
int lineYFrom = arrowY - 4;
int lineYTo = arrowY + 8;
using( var separatorPen = new Pen(Brushes.DarkGray){DashStyle = DashStyle.Dot})
{
pevent.Graphics.DrawLine(separatorPen, lineX, lineYFrom, lineX, lineYTo);
}
}
}
}
var splitRect = new Rectangle(this.Width - this.SplitWidth, this.Location.Y, this.SplitWidth, this.Height);
второй параметр должен быть изменен на 0
– Jacky
11 January 2015 в 03:29