wpf меню с вкладками
Wpf меню с вкладками
В WPF предлагаются два элемента управления меню: Menu (для главных меню) и ContextMenu (для всплывающих меню, присоединяемых к другим элементам). Как и для всех остальных классов, WPF выполняет визуализацию для элементов управления Menu и ContextMenu. Это означает, что упомянутые элементы управления не являются простыми оболочками Win32 и могут использоваться несколькими необычными способами.
Если класс Menu используется в приложении, обслуживаемом в браузере, он появляется в верхней части страницы. Окно браузера упаковывает страницу приложения и может как включать, так и не включать собственное меню, которое тогда будет отображаться совершенно отдельно.
Класс Menu
В WPF не делается никаких предположений по поводу того, где должно размещаться автономное меню. Обычно оно пристыковывается в верхней части окна с помощью элемента управления DockPanel или верхней строки элемента управления Grid либо просто растягивается по всей ширине окна. Однако на самом деле меню можно размещать где угодно, даже рядом с другими элементами управления. Более того, в окно можно добавлять столько меню, сколько нужно. Хотя особого смысла в этом и нет, но также существует возможность размещать строки меню стопками и вразброс по всему пользовательскому интерфейсу.
Такая свобода действий открывает кое-какие интересные возможности. Например, если вы создадите меню с одним высокоуровневым заголовком и стилизуете его под кнопку, получится всплывающее меню, вызываемое одиночным щелчком мыши. Применение подобных уловок может помочь добиться в точности желаемого эффекта в сложном интерфейсе, а может оказаться и просто более изощренным способом запутывания пользователей.
Очевидно, что во внешний вид меню и подменю можно вносить и более радикальные изменения с помощью триггеров и шаблонов элементов управления. Базовую логику стилизации можно посмотреть в используемом по умолчанию шаблоне элемента управления MenuItem.
Элементы меню
Все меню конструируются из объектов MenuItem и Separator. Класс MenuItem унаследован от HeaderedltemsControl, поскольку каждый элемент меню имеет заголовок (в котором содержится предназначенный для него текст) и может умещать в себе коллекцию объектов MenuItem (с помощью которой представляется подменю). Класс Separator просто отображает горизонтальную линию для разделения элементов меню.
Ниже приведена простая комбинация объектов MenuItem, которые создают элементарную структуру меню, показанную на рисунке:
WPF позволяет нарушать многие из привычных правил структуризации меню. Например, внутри Menu или MenuItem допускается размещать объекты, отличные от MenuItem. Это дает возможность создавать меню, содержащие обычные элементы WPF, начиная от Checkbox и заканчивая DocumentViewer. По ряду причин размещение в меню объектов, отличных от MenuItem, практически всегда является плохой идеей, поскольку приводит к появлению нескольких необычных проблем, которые нужно отслеживать и исправлять. Например, элемент TextBox в MenuItem будет утрачивать фокус сразу же после перемещения мыши за пределы этого MenuItem.
Если же действительно необходимо создать пользовательский интерфейс, включающий нечто вроде раскрывающихся меню с элементами управления, лучше рассмотреть вариант использования другого элемента (например, Expander) и его стилизации в соответствии с имеющимися потребностями. Элементы управления Menu и MenuItems стоит применять только тогда, когда действительно требуется поведение, свойственное меню — другими словами, когда необходима группа активизируемых щелчком команд.
Если нужно, чтобы подменю после открытия оставались видимыми до тех пора, пока пользователь не щелкнет в каком-нибудь другом месте, установите свойство StaysOpenOnClick в true.
Объекты MenuItem можно также использовать и за пределами стандартных контейнеров Menu, ContextMenu и MenuItem. Они будут вести себя точно так же, как и обычные элементы меню, т.е. будут подсвечиваться голубым при наведении на них курсора мыши и позволять выполнять щелчок для инициации действий. Однако получить доступ к любым содержащимся в них подменю не получится. Опять-таки, это одна из тех возможностей Menu, которая вряд ли будет пользоваться популярностью среди разработчиков.
Для реагирования на щелчок на элементе MenuItem можно использовать событие MenuItem.Click. Можно обеспечить его обработку для отдельных элементов, а можно просто присоединить к корневому дескриптору Menu соответствующий обработчик таких событий. Другой вариант — с помощью свойств Command, CommandParameter и CommandTarget соединить MenuItem с объектом Command, как это делалось для кнопок.
Такой вариант особенно удобен, если пользовательский интерфейс включает несколько меню (например, главное меню и контекстное меню), в которых применяются одинаковые команды, или меню и панель инструментов с кнопками, аналогичными командам этого меню.
Помимо текстового содержимого (которое предоставляется через свойство Header), объекты MenuItem могут в действительности отображать еще несколько перечисленных ниже деталей:
миниатюрный значок в области поля сразу же слева от команды меню;
флажок в области поля (в случае указания сразу флажка и значка отображаться будет только флажок);
текст сокращенной клавиатурной команды справа от текста меню (например, текст Ctrl+O для команды Open (Открыть)).
В указании всех этих деталей нет ничего сложного. Для отображения миниатюрного значка необходимо установить свойство MenuItem.Icon. Интересно то, что свойство Icon способно принимать любой объект, что позволяет создавать для отображения даже миниатюрный векторный рисунок. Это дает возможность в полной мере воспользоваться преимуществами не зависящей от разрешения системы масштабирования WPF и отобразить больше деталей при более высоких настройках DPI системы. При желании иметь обычный значок, должен использоваться просто элемент Image с растровым изображением.
Для отображения рядом с элементом меню флажка понадобится установить свойство MenuItem.IsChecked в true. Вдобавок, если IsCheckable равно true, щелчок на данном элементе меню будет переводить его из отмеченного в неотмеченное состояние и наоборот. Однако способа организации группы элементов меню с взаимно исключающей отметкой не существует. Если необходим именно такой эффект, придется писать специальный код, снимающий отметки с других флажков при установке флажка рядом с элементом.
Текст сокращенной клавиатурной команды для элемента меню указывается с помощью свойства MenuItem.InputGestureText. Однако простое отображение этого текста активным его не сделает. Об отслеживании нажатий соответствующих клавиш разработчик должен позаботиться сам. Практически всегда это требует немалой работы, поэтому элементы меню часто используются с командами, позволяющими обеспечить поведение сокращенных клавиатурных команд и InputGestureText за один шаг.
Например, следующий элемент MenuItem связывается с командой ApplicationsCommands.Open:
Доступно также несколько полезных свойств, которые позволяют узнать текущее состояние MenuItem: IsChecked, IsHighlighted, IsPressed и IsSubmenuOpen. Их можно использовать для написания триггеров, применяющих различные стили в ответ на определенные действия.
Класс ContextMenu
Как и Menu, класс ContextMenu содержит коллекцию объектов MenuItem. Разница состоит лишь в том, что ContextMenu не может размещаться в окне. Вместо этого он может использоваться только для установки свойства ContextMenu другого элемента:
Свойство ContextMenu определено в классе FrameworkElement, поэтому оно поддерживается практически всеми элементами WPF. В случае, когда это свойство установлено для элемента, у которого имеется собственное контекстное меню, стандартное меню заменяется тем, что указано в этом свойстве. Если просто нужно удалить существующее меню, установите ContextMenu в null.
Общие сведения о контекстном меню
PopupЭлемент управления предоставляет способ отображения содержимого в отдельном окне, расположенном поверх текущего окна приложения относительно назначенного элемента или экранной координаты. В этом разделе описывается Popup элемент управления и предоставляются сведения об его использовании.
Что такое контекстное меню?
Создание всплывающего окна
Элементы управления, реализующие контекстное меню
PopupЭлементы управления можно создавать в других элементах управления. Следующие элементы управления реализуют Popup элемент управления для конкретных применений.
ToolTip. Если необходимо создать подсказку для элемента, используйте ToolTip ToolTipService классы и. Дополнительные сведения см. в разделе Общие сведения о всплывающих подсказках.
ContextMenu. Если необходимо создать контекстное меню для элемента, используйте ContextMenu элемент управления. Дополнительные сведения см. в разделе Общие сведения об элементе управления ContextMenu.
ComboBox. Если необходимо создать элемент управления выбора с раскрывающимся списком, который можно отобразить или скрыть, используйте ComboBox элемент управления.
Expander. Если необходимо создать элемент управления, отображающий заголовок с сворачиваемой областью отображения содержимого, используйте Expander элемент управления. Дополнительные сведения см. в разделе Общие сведения об элементе управления Expander.
Внешний вид и поведение контекстного меню
PopupЭлемент управления предоставляет функциональные возможности, позволяющие настраивать его поведение и внешний вид. Например, можно задать поведение открытия и закрытия, анимацию, эффекты непрозрачности и растровых эффектов, а также Popup размер и расположение.
Поведение открытия и закрытия
OpenedСобытия и Closed вызываются, когда Popup окно содержимого открыто или закрыто.
Анимация
Прозрачность и эффекты для точечных рисунков
Размер контекстного меню
По умолчанию Popup размер автоматически изменяется в соответствии с содержимым. При возникновении автоматического изменения размера некоторые эффекты растрового изображения могут быть скрыты, так как размер области экрана по умолчанию, определенный для Popup содержимого, не предоставляет достаточно места для отображения эффектов растрового изображения.
Определение положения контекстного меню
Настройка размещения всплывающего окна
Контекстное меню и визуальное дерево
Menu is a control that enables you to hierarchically organize elements associated with the commands and event handlers. Menu is an ItemsControl, so it can contain a collection of any object type such as string, image, or panel. The hierarchical inheritance of Menu class is as follows −
Below are the commonly used properties on Menu class
Given below are the most commonly used properties of Menu.
Gets or sets a brush that describes the background of a control. (Inherited from Control.)
Gets or sets the BindingGroup that is used for the element. (Inherited from FrameworkElement.)
Obsolete. Gets or sets a bitmap effect that applies directly to the rendered content for this element. This is a dependency property. (Inherited from UIElement.)
Gets or sets the border thickness of a control. (Inherited from Control.)
Gets or sets the context menu element that should appear whenever the context menu is requested through user interface (UI) from within this element. (Inherited from FrameworkElement.)
Gets or sets the bitmap effect to apply to the UIElement. This is a dependency property. (Inherited from UIElement.)
Gets or sets the suggested height of the element. (Inherited from FrameworkElement.)
Gets or sets a value that indicates whether this Menu receives a main menu activation notification.
Gets the collection used to generate the content of the ItemsControl. (Inherited from ItemsControl.)
Gets or sets the template that defines the panel that controls the layout of items. (Inherited from ItemsControl.)
Gets or sets a collection used to generate the content of the ItemsControl. (Inherited from ItemsControl.)
Gets or sets a composite string that specifies how to format the items in the ItemsControl if they are displayed as strings. (Inherited from ItemsControl.)
Gets or sets the DataTemplate used to display each item. (Inherited from ItemsControl.)
Gets or sets the tool-tip object that is displayed for this element in the user interface (UI). (Inherited from FrameworkElement.)
Gets or sets the vertical alignment of the control’s content. (Inherited from Control.)
Gets or sets the width of the element. (Inherited from FrameworkElement.)
Commonly Used Events in Menu Class
Occurs just before any context menu on the element is closed. (Inherited from FrameworkElement.)
Occurs when any context menu on the element is opened. (Inherited from FrameworkElement.)
Occurs when a key is pressed while focus is on this element. (Inherited from UIElement.)
Occurs when a key is released while focus is on this element. (Inherited from UIElement.)
Occurs just before any tooltip on the element is closed. (Inherited from FrameworkElement.)
Occurs when any tooltip on the element is opened. (Inherited from FrameworkElement.)
Occurs when a finger touches the screen while the finger is over this element. (Inherited from UIElement.)
Occurs when a touch moves from outside to inside the bounds of this element. (Inherited from UIElement.)
Occurs when a touch moves from inside to outside the bounds of this element. (Inherited from UIElement.)
Occurs when a finger moves on the screen while the finger is over this element. (Inherited from UIElement.)
Occurs when a finger is raised off of the screen while the finger is over this element. (Inherited from UIElement.)
Example
Let’s create a new WPF project with the name WPFMenuControl.
Drag a menu control from the Toolbox to the design window.
The following example contains three menu options with some menu items. When the user clicks an item, the program updates the title. Here is the XAML code −
Here is the events implementation in C#.
When you compile and execute the above code, it will produce the following output −
We recommend that you execute the above example code and try the other properties and events of Menu class.
Как правильно сделать выпадающее боковое меню и д.р. Новичку
Боковое выпадающее меню перекрывается контентом
Добрый день подскажите а такую проблему решить можно http://auradekor.ru/
Как сделать многоуровневое боковое меню для WooCommerce?
Привет Какой плагин подойдет, чтобы сделать меню для Woocommerce, подобное этому? Как тут.
Как сделать,чтобы боковое меню отображалось на странице
Здравствуйте.Я совсем недавно начала писать сайты на Битриксе. Возникает много вопросов.
Сначала тип для одного бита:
Хоть чуток в компоновке разберитесь.
Это же не Формы.
Если вам не нужна WPF компоновка, какой, вообще, смысл в использовании WPF?
Добавлено через 2 минуты
Из темы «WPF vs WinForms (для начинающих)» по ссылке в подписи моего поста:
К сожалению, конструктор Visual Studio не помогает в освоении компоновки WPF. При вставке элемента (как это делается в конструкторе WinForms) элемент жёстко позиционируется с помощью свойства Margin элемента. Из-за этого начинающие поддаются заблуждению, что так и надо делать. Я сам по началу попал в этот капкан.
Из-за этой особенности конструктора WPF, элементы окна не надо создавать перетаскиванием на окно. Их надо прописывать в XAML окна «в ручную». Правильная компоновка элементов делает окно адаптивным. Элементы в нём сами меняют свои размеры и положение в зависимости от размеров окна и окружающих элементов. Всё это является «внутренним» изначально присущим свойством WPF элементов и не требует поддержки в коде C# в CB окна.