Начало работы с панелями инструментов¶
В этом руководстве показано, как использовать библиотеку панелей инструментов Eremex для создания пользовательского интерфейса панели инструментов с нуля. В нем представлены контролы для реализации пользовательского интерфейса панели инструментов и демонстрируются свойства основных панелей инструментов.
В руководстве создается пользовательский интерфейс панели инструментов для двух текстовых редакторов, размещенных в центре окна. Пользовательский интерфейс панели инструментов состоит из главного меню, панели состояния и обычных панелей инструментов, на которых отображаются различные элементы: кнопки, кнопки-переключатели, встроенные редакторы, подменю и текстовые элементы.
Все панели инструментов, кроме одной, пристыкованы к краям окна. На этих панелях инструментов есть команды, которые работают с первым текстовым редактором. Одна панель инструментов (автономная панель инструментов) размещена между текстовыми редакторами. Он предоставляет команды для второго текстового редактора.
В руководстве также показано, как привязать текстовый редактор к контекстному меню из Библиотеки Панелей Инструментов и Меню.
1. Создайте новый проект¶
Убедитесь, что вы установили Шаблоны Eremex Avalonia , которые упрощают создание проектов Avalonia UI с помощью контролов Eremex. Создайте новый проект из шаблона Eremex Avalonia .NET MVVM App
и назовите его "Панели-образец".
Этот шаблон добавляет сборки с контролами Eremex и темой отрисовки DeltaDesign в созданный проект и регистрирует тему для использования.
2. Добавьте компонент ToolbarManager¶
Начните с определения компонента ToolbarManager
в XAML.
<mx:MxWindow ...
xmlns:mx="https://schemas.eremexcontrols.net/avalonia"
xmlns:mxb="https://schemas.eremexcontrols.net/avalonia/bars"
xmlns:mxe="https://schemas.eremexcontrols.net/avalonia/editors"
xmlns:vm="using:Bars_sample.ViewModels"
xmlns:view="clr-namespace:Bars_sample.Views"
Title="Toolbars Sample"
>
<mx:MxWindow.DataContext>
<vm:MainWindowViewModel/>
</mx:MxWindow.DataContext>
<mxb:ToolbarManager IsWindowManager="True">
<Grid RowDefinitions="Auto, *, Auto, *, Auto" ColumnDefinitions="Auto, *, Auto">
<TextBox Grid.Row="1" Grid.Column="1" x:Name="textBox1"
Text="Text Editor" AcceptsReturn="True"/>
<TextBox x:Name="textBox2" Grid.Row="3" Grid.Column="1"
Text="Text Editor #2" AcceptsReturn="True"/>
</Grid>
</mxb:ToolbarManager>
</mx:MxWindow>
ToolbarManager
- это основной компонент, который управляет панелями инструментов, контекстными меню и элементами меню. Компонент обрабатывает горячие клавиши, вызывает команды, связанные с соответствующими элементами, поддерживает настройку среды выполнения панели инструментов и выполняет сериализацию и десериализацию пользовательского интерфейса панели.
Компонент ToolbarManager
должен обернуть клиентский контрол (контролы), для которого создан пользовательский интерфейс панели инструментов.
3. Создание контейнеров панели инструментов¶
Чтобы разрешить пристыковывать панель инструментов к определенной позиции в окне/UserControl, сначала создайте контейнер панели инструментов (ToolbarContainerControl
). Контейнер панели инструментов - это контрол, который отображает панели инструментов в пристыкованном состоянии и поддерживает операции перетаскивания панели инструментов.
В XAML создайте четыре контейнера панели инструментов (объекты ToolbarContainerControl
) вдоль верхнего, нижнего, левого и правого краев окна. После этого вы сможете, чтобы пристыковать панели инструментов в этих позициях.
xmlns:mxb="https://schemas.eremexcontrols.net/avalonia/bars"
<mxb:ToolbarManager IsWindowManager="True">
<Grid RowDefinitions="Auto, *, Auto, *, Auto" ColumnDefinitions="Auto, *, Auto">
<mxb:ToolbarContainerControl DockType="Top" Grid.ColumnSpan="3"/>
<mxb:ToolbarContainerControl DockType="Left" Grid.Row="1"
Grid.Column="0" Grid.RowSpan="3" />
<TextBox Grid.Row="1" Grid.Column="1" x:Name="textBox1"
Text="Text Editor" AcceptsReturn="True"/>
<TextBox x:Name="textBox2" Grid.Row="3" Grid.Column="1"
Text="Text Editor #2" AcceptsReturn="True"/>
<mxb:ToolbarContainerControl DockType="Right" Grid.Row="1"
Grid.Column="2" Grid.RowSpan="3"/>
<mxb:ToolbarContainerControl DockType="Bottom"
Grid.Row="4" Grid.ColumnSpan="3"/>
</Grid>
</mxb:ToolbarManager>
Опции контейнера панели инструментов¶
Основным свойством ToolbarContainerControl
является ToolbarContainerControl.DockType
, которое определяет, как контейнер пристыкован к своему родительскому элементу. Вы можете установить свойство DockType
равным Left
, Right
, Top
, Bottom
и Standalone
.
Свойство DockType
определяет видимость границ контейнера и выравнивание вложенных панелей инструментов по умолчанию. Например, если опция контейнера DockType
равна Left
, контейнер рисует границу по своему правому краю и размещает вложенные панели инструментов вертикально. На картинке ниже показан контейнер панели инструментов, для свойства которого для опции DockType
установлено значение Left
. Дочерние панели инструментов ориентированы вертикально в соответствии с свойством DockType
.
4. Создайте панели инструментов¶
Добавьте панели инструментов (объекты Toolbar
) в необходимые контейнеры панелей инструментов.
xmlns:mxb="https://schemas.eremexcontrols.net/avalonia/bars"
<mxb:ToolbarManager IsWindowManager="True">
<Grid RowDefinitions="Auto, *, Auto, *, Auto" ColumnDefinitions="Auto, *, Auto">
<mxb:ToolbarContainerControl DockType="Top" Grid.ColumnSpan="3">
<mxb:Toolbar x:Name="MainMenu" ToolbarName="Main Menu" DisplayMode="MainMenu">
</mxb:Toolbar>
<mxb:Toolbar x:Name="EditToolbar" ToolbarName="Edit"
ShowCustomizationButton="True">
</mxb:Toolbar>
<mxb:Toolbar x:Name="FontToolbar" ToolbarName="Font"
ShowCustomizationButton="True">
</mxb:Toolbar>
</mxb:ToolbarContainerControl>
<mxb:ToolbarContainerControl DockType="Left" Grid.Row="1"
Grid.Column="0" Grid.RowSpan="3">
<mxb:Toolbar x:Name="TextEditingToolbar" ToolbarName="Text Editing"
ShowCustomizationButton="True" >
</mxb:Toolbar>
</mxb:ToolbarContainerControl>
<TextBox Grid.Row="1" Grid.Column="1" x:Name="textBox1" Text="Text Editor"
AcceptsReturn="True" CornerRadius="0" FontFamily="Arial" FontSize="20"/>
<TextBox x:Name="textBox2" Grid.Row="3" Grid.Column="1" Text="Text Editor #2"
AcceptsReturn="True" CornerRadius="0" FontFamily="Arial" FontSize="20"/>
<mxb:ToolbarContainerControl DockType="Right" Grid.Row="1"
Grid.Column="2" Grid.RowSpan="3"/>
<mxb:ToolbarContainerControl DockType="Bottom" Grid.Row="4" Grid.ColumnSpan="3">
<mxb:Toolbar DisplayMode="StatusBar" ToolbarName="Status Bar" x:Name="StatusBar">
</mxb:Toolbar>
</mxb:ToolbarContainerControl>
</Grid>
</mxb:ToolbarManager>
Приведенный выше фрагмент заполняет три контейнера панели инструментов панелями инструментов и оставляет один контейнер панели инструментов пустым. Пользователи смогут перетаскивать панели инструментов в любой из четырех контейнеров панелей инструментов во время выполнения программы.
Укажите главное меню и панель состояния¶
Чтобы указать, что панель инструментов является главным меню или панелью состояния, установите для ее свойства Toolbar.DisplayMode
значения MainMenu
и StatusBar
соответственно.
Главное меню и панель состояния имеют отличительные свойства внешнего вида и поведения. Например, они не содержат маркера перетаскивания, поэтому пользователи не могут их перетаскивать. Пользователь не может скрыть главное меню и панель состояния во время выполнения программы.
Опции панели инструментов¶
Объекты Toolbar
предоставляют множество опций для настройки их вида, размещения и свойств поведения. Некоторые из этих опций включают:
-
ToolbarName
— Отображаемое имя панели инструментов. Названия панелей инструментов отображаются в окне настройки, а также когда панель инструментов находится в плавающем состоянии. -
ShowCustomizationButton
— Определяет видимость кнопки настройки, используемой для активации режима настройки и открытия окна настройки. -
AllowDragToolbar
— Определяет видимость маркера перетаскивания, который позволяет пользователям перетаскивать панель инструментов. -
DockType
— Это свойство позволяет перемещать панель инструментов в определенный контейнер панели инструментов в коде или делать панель инструментов плавающей. StretchToolbar
— Включает растягивание панели инструментов. В этом режиме никакая другая панель инструментов не может отображаться в той же строке.WrapItems
— Включает многорядное размещение панели инструментов.
5. Создание элементов панели инструментов¶
Следующим шагом является заполнение панелей инструментов элементами панели инструментов: обычными кнопками, кнопками-переключателями, встроенными редакторами, подменю и текстовыми элементами. Элементы панели инструментов инкапсулируются классами, производными от класса ToolbarItem
, который предоставляет общие опции элемента панели инструментов.
В этом руководстве создаются следующие элементы панели инструментов:
ToolbarButtonItem¶
Обычная кнопка, которая запускает команду, указанную свойством Command
.
<mxb:Toolbar x:Name="EditToolbar" ToolbarName="Edit" ShowCustomizationButton="True" >
<mxb:ToolbarButtonItem Header="Cut" Command="{Binding #textBox1.Cut}"
IsEnabled="{Binding #textBox1.CanCut}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditCut.svg'}"
Category="Edit"/>
<mxb:ToolbarButtonItem Header="Copy" Command="{Binding #textBox1.Copy}"
IsEnabled="{Binding #textBox1.CanCopy}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditCopy.svg'}"
Category="Edit"/>
</mxb:Toolbar>
Опции общего элемента панели инструментов¶
Базовый класс ToolbarItem
предоставляет общие опции, наследуемые всеми элементами панели инструментов. Некоторые из этих опций включают:
Alignment
— Выравнивание элемента на панели инструментов.Category
— категория, к которой принадлежит элемент. Категории используются для организации элементов в логические группы в окне настройки.Command
— Команда, выполняемая при нажатии на кнопку.CommandParameter
— Командный параметр, передаваемый указанной команде.DisplayMode
— Определяет, отображать ли только картинку, заголовок или и то, и другое.Header
— Текст для отображения элемента.Glyph
— Картинка элемента.GlyphAlignment
— Выравнивание картинки относительно заголовка элемента.GlyphSize
— Размер отображаемой картинки.ShowSeparator
— Позволяет отображать разделитель перед элементом.
Назначьте контрол/меню всплывающего окна ToolbarButtonItem¶
Вы можете привязать контрол/меню всплывающего окна к объекту ToolbarButtonItem
. Всплывающее окно активируется щелчком по стрелке встроенного всплывающего окна или по самому элементу (смотрите опцию DropDownArrowVisibility
ниже для получения дополнительной информации).
Давайте привяжем кнопку Paste (ToolbarButtonItem
) к всплывающему окну меню. В меню всплывающего окна отобразятся команды Paste и Paste As.
<mxb:ToolbarButtonItem Header="Paste" Command="{Binding #textBox1.Paste}"
IsEnabled="{Binding #textBox1.CanPaste}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditPaste.svg'}"
Category="Edit">
<mxb:ToolbarButtonItem.DropDownControl>
<mxb:PopupMenu>
<mxb:ToolbarButtonItem Header="Paste" Command="{Binding #textBox1.Paste}"
IsEnabled="{Binding #textBox1.CanPaste}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditPaste.svg'}"/>
<mxb:ToolbarButtonItem Header="Paste As"
Command="{Binding PasteAsCommand}"
IsEnabled="{Binding #textBox1.CanPaste}"/>
</mxb:PopupMenu>
</mxb:ToolbarButtonItem.DropDownControl>
</mxb:ToolbarButtonItem>
Следующие свойства используются для указания контрола всплывающего окна и способа его отображения:
-
DropDownControl
— Получает или устанавливает контрол/меню всплывающего окна, связанные с элементом. Это свойство принимает объектыPopupContainer
иPopupMenu
. -
DropDownArrowVisibility
— Указывает, отображает ли элемент стрелку всплывающего окна, используемую для вызова связанного контрола всплывающего окна. Поддерживаемые опции включают:-
ShowArrow
— Видна стрелка всплывающего окна. Элемент и стрелка действуют как единая кнопка. При щелчке по ним отображается связанный контрол всплывающего окна. -
ShowSplitArrow
илиDefault
— видна стрелка всплывающего окна. Она действует как отдельная кнопка, встроенная в элемент. Щелчок по стрелке всплывающего окна вызывает связанный с ним контрол всплывающего окна. Щелчок по элементу вызывает его команду. -
Hide
— Стрелка всплывающего окна скрыта. Щелчок по элементу вызывает контрол всплывающего окна.
-
ToolbarMenuItem¶
Кнопка, вызывающая подменю. Чтобы добавить элементы в подменю, определите их между начальным и конечным тегами <ToolbarMenuItem>
в разметке XAML или добавьте их в коллекцию Items
.
<mxb:Toolbar x:Name="MainMenu" ToolbarName="Main Menu" DisplayMode="MainMenu">
<mxb:ToolbarMenuItem Header="File" Category="File">
<mxb:ToolbarButtonItem Header="New"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/FileNew.svg'}"
Category="File" Command="{Binding NewFileCommand}"/>
<mxb:ToolbarButtonItem Header="Open"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/FileOpen.svg'}"
Category="File" Command="{Binding OpenFileCommand}"/>
<mxb:ToolbarButtonItem Header="Print"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/FilePrint.svg'}"
Category="File" Command="{Binding PrintCommand}" ShowSeparator="True"/>
</mxb:ToolbarMenuItem>
</mxb:Toolbar>
Вы можете добавить в подменю все поддерживаемые типы элементов.
ToolbarCheckItem¶
Кнопка-переключатель, которая может находиться как в обычном, так и в нажатом состоянии.
<mxb:Toolbar x:Name="FontToolbar" ToolbarName="Font" ShowCustomizationButton="False">
<mxb:ToolbarCheckItem Header="Bold"
IsChecked="{Binding #textBox1.FontWeight,
Converter={view:BoolToFontWeightConverter}, Mode=TwoWay}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/FontBold.svg'}"
Category="Font"/>
...
</mxb:Toolbar>
Опции ToolbarCheckItem¶
IsChecked
— Возвращает или устанавливает состояние нажатия кнопки.CheckedChanged
— Событие, которое срабатывает при изменении нажатого состояния.
ToolbarEditorItem¶
Элемент, позволяющий встроить редактор Eremex в панель инструментов или меню.
<mxb:Toolbar x:Name="FontToolbar" ToolbarName="Font" ShowCustomizationButton="False">
<mxb:ToolbarEditorItem Header="Font:" EditorWidth="150" Category="Font"
EditorValue="{Binding #textBox1.FontFamily,
Converter={view:FontNameToFontFamilyConverter}}">
<mxb:ToolbarEditorItem.EditorProperties>
<mxe:ComboBoxEditorProperties
ItemsSource="{Binding $parent[view:MainWindow].Fonts}"
IsTextEditable="False"/>
</mxb:ToolbarEditorItem.EditorProperties>
</mxb:ToolbarEditorItem>
...
</mxb:Toolbar>
Опции ToolbarEditorItem¶
EditorValue
— Позволяет вам устанавливать и считывать значение встроенного редактора.EditorProperties
— Указывает тип редактора, который должен быть встроен в панель инструментов/меню. В приведенном выше фрагменте кода свойствуEditorProperties
присвоено свойство объектаComboBoxEditorProperties
. Этот объект содержит свойства, специфичные для контролаComboBoxEditor
. Панель инструментов автоматически создаст контролComboBoxEditor
во время выполнения программы из указанного объектаComboBoxEditorProperties
.
ToolbarTextItem¶
Текстовая метка. Щелчок по текстовой метке не вызывает никакого действия (команды).
<mxb:Toolbar DisplayMode="StatusBar" ToolbarName="Status Bar"
x:Name="StatusBar" ShowCustomizationButton="False">
<mxb:ToolbarTextItem Name="tbTextItem1" Alignment="Far"
ShowSeparator="True" ShowBorder="False" Category="Info"
CustomizationName="Position Info"
Header="{Binding $parent[view:MainWindow].LineNumber}"/>
</mxb:Toolbar>
Опции ToolbarTextItem¶
SizeMode
— Получает или устанавливает, будет ли размер элемента автоматически подогнан под его содержимое или растянут, чтобы занять доступное пространство на панели инструментов.ShowBorder
— Получает или устанавливает, следует ли отображать рамку вокруг элемента.
Другие типы элементов панели инструментов¶
Библиотека панелей инструментов также поддерживает другие типы элементов панели инструментов, которые не продемонстрированы в этом руководстве:
ToolbarItemGroup
— Группа элементов панели инструментов.ToolbarCheckItemGroup
— Группа переключающих кнопок. Используйте его для создания группы взаимоисключающих переключающих элементов или группы, которая поддерживает одновременный выбор нескольких элементов.
Смотрите следующий раздел для получения дополнительной информации: Элементы панели инструментов .
6. Создайте автономную панель инструментов¶
Вы можете размещать панели инструментов в любой позиции внутри окна, а не только по его краям. Например, вы можете разместить панели инструментов с командами рядом с целевым контролом. Эти панели инструментов называются "автономными", поскольку они находятся в "автономных" контейнерах панелей инструментов.
Чтобы создать автономную панель инструментов, выполните следующие действия:
1. Создайте контейнер панели инструментов (ToolbarContainerControl
) в требуемой позиции. Установите для его свойства DockType
значение Standalone
.
Автономные контейнеры панели инструментов не имеют границ.
- Добавьте панель инструментов с командами в этот контейнер панели инструментов.
Приведенный ниже код отображает автономную панель инструментов между двумя текстовыми редакторами. Команда Select All на панели инструментов выделяет текст во втором текстовом редакторе.
<mxb:ToolbarManager Name="toolbarManager1" IsWindowManager="True" >
<Grid RowDefinitions="Auto, *, Auto, *, Auto" ColumnDefinitions="Auto, *, Auto">
...
<TextBox Grid.Row="1" Grid.Column="1" x:Name="textBox1" Text="Text Editor"
AcceptsReturn="True"/>
<mxb:ToolbarContainerControl DockType="Standalone" Grid.Row="2" Grid.Column="1">
<mxb:Toolbar x:Name="TextEditor2Toolbar" ToolbarName="Standalone Toolbar"
ShowCustomizationButton="True" AllowDragToolbar="true" >
<mxb:ToolbarButtonItem Header="Select All"
Command="{Binding #textBox2.SelectAll}" Category="TextEditor2 Toolbar" />
<mxb:ToolbarButtonItem Header="Make Toolbar Floating"
Command="{Binding $parent[view:MainWindow].MakeToolbar2Floating}"
ShowSeparator="True"
Category="TextEditor2 Toolbar"/>
</mxb:Toolbar>
</mxb:ToolbarContainerControl>
<TextBox x:Name="textBox2" Grid.Row="3" Grid.Column="1" Text="Text Editor #2"
AcceptsReturn="True"/>
</Grid>
</mxb:ToolbarManager>
7. Назначьте контекстное меню текстовому редактору¶
Чтобы указать контекстное меню для контрола, создайте объект PopupMenu
и назначьте его целевому контролу, используя attached-свойство ToolbarManager.ContextPopup
. Во всплывающие меню можно добавлять элементы панели инструментов любого типа.
<TextBox Grid.Row="1" Grid.Column="1" x:Name="textBox1" Text="Text Editor"
AcceptsReturn="True" CornerRadius="0" FontFamily="Arial" FontSize="20" >
<mxb:ToolbarManager.ContextPopup>
<mxb:PopupMenu ShowIconStrip="True" Header="Text Box Menu" ShowHeader="True">
<mxb:ToolbarButtonItem Header="Undo" HotKeyDisplayString="Ctrl+Z"
Command="{Binding #textBox1.Undo}" IsEnabled="{Binding #textBox1.CanUndo}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditUndo.svg'}"
Category="Edit"/>
<mxb:ToolbarButtonItem Header="Redo" HotKeyDisplayString="Ctrl+Y"
Command="{Binding #textBox1.Redo}" IsEnabled="{Binding #textBox1.CanRedo}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditRedo.svg'}"
Category="Edit"/>
<mxb:ToolbarSeparatorItem/>
<mxb:ToolbarButtonItem Header="Clear" Command="{Binding #textBox1.Clear}"
HotKeyDisplayString="Ctrl+Q" Category="Edit"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditDelete.svg'}"/>
</mxb:PopupMenu>
</mxb:ToolbarManager.ContextPopup>
</TextBox>
Опции всплывающего меню¶
ContentRightIndent
— Задает ширину пустого пространства справа от текста элементов меню.
Header
— Позволяет задать заголовок меню.ShowHeader
— Возвращает или устанавливает, будет ли отображаться заголовок меню.ShowIconStrip
— Получает или устанавливает, следует ли отображать вертикальную полосу значков для элементов меню. Значок элемента меню определяется свойствомGlyph
элемента.
8. Укажите горячие клавиши для элементов панели инструментов¶
Используйте свойство ToolbarItem.HotKey
, чтобы назначить элементам горячие клавиши.
<mxb:ToolbarButtonItem
Header="Clear" Command="{Binding #textBox1.Clear}" HotKey="Ctrl+Q"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditDelete.svg'}" Category="Edit"/>
Границы компонента ToolbarManager
определяют дефолтная область действия горячих клавиш. Если фокус находится в пределах области действия горячих клавиш, ToolbarManager
может перехватывать и обрабатывать горячие клавиши.
Вы можете присвоить свойству ToolbarManager.IsWindowManager
значение true
, чтобы расширить область действия горячих клавиш на все окно. В этом случае ToolbarManager
регистрирует горячие клавиши в окне и может обрабатывать горячие клавиши, даже если фокус находится за пределами возможностей ToolbarManager
.
Смотрите следующий раздел для получения дополнительной информации: Горячие клавиши элемента панели инструментов .
9. Назначьте всплывающие подсказки элементам панели инструментов¶
Свойство ToolTip
позволяет вам указывать всплывающие подсказки для элементов панели инструментов.
<mxb:ToolbarButtonItem Header="Cut" Command="{Binding #textBox1.Cut}"
IsEnabled="{Binding #textBox1.CanCut}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditCut.svg'}"
Category="Edit"
ToolTip.Tip="Cut Selection"/>
10. Сделайте панель инструментов плавающей¶
Давайте создадим панель инструментов, плавающую в коде. Убедитесь, что у целевой панели инструментов есть имя, чтобы вы могли получить к ней доступ. После того как вы получите объект панели инструментов, установите для его свойства Toolbar.DockType
значение Floating
. Используйте свойство Toolbar.FloatingPosition
, чтобы задать местоположение плавающей панели инструментов.
EditToolbar.DockType = Eremex.AvaloniaUI.Controls.Bars.MxToolbarDockType.Floating;
EditToolbar.FloatingPosition = new PixelPoint(200, 200);
Чтобы создать плавающую панель инструментов в XAML, определите объект Toolbar
в коллекции ToolbarManager.Toolbars
и задайте свойству Toolbar.DockType
значение Floating
.
Смотрите следующий раздел для получения дополнительной информации: Плавающие панели инструментов .
11. Время выполнения¶
Библиотека панелей инструментов поддерживает настройку панели инструментов пользователями во время выполнения программы. Запустите приложение, чтобы увидеть эти функции в действии:
- Перетаскивание панелей - Панели инструментов отображают маркеры перетаскивания, которые позволяют изменять порядок расположения панелей.
- Быстрая настройка панели инструментов — вы можете быстро перемещать элементы внутри панелей и между ними с помощью перетаскивания, удерживая нажатой клавишу Alt.
- Режим настройки и окно настройки — нажмите кнопку настройки на панели инструментов ("..."), а затем выберите команду "Настроить". При активации режима настройки отображается окно настройки:
В режиме настройки вы можете выполнить следующие действия:
- Скрывайте и восстанавливайте панели инструментов.
- Создавайте пользовательские панели инструментов и управляйте ими.
- Скрывайте, восстанавливайте и переставляйте элементы панели инструментов между панелями и подменю.
12. Полный код¶
Ниже вы можете найти полный код этого руководства.
Картинки в формате SVG, используемые в этом примере, помещены в папку Bars-sample/Images/Toolbars
. У них для свойства Build Action
установлено значение AvaloniaResource
.
MainWindow.axaml:
<mx:MxWindow xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:Bars_sample.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mx="https://schemas.eremexcontrols.net/avalonia"
xmlns:mxe="https://schemas.eremexcontrols.net/avalonia/editors"
xmlns:mxb="https://schemas.eremexcontrols.net/avalonia/bars"
xmlns:view="clr-namespace:Bars_sample.Views"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Bars_sample.Views.MainWindow"
x:DataType="vm:MainWindowViewModel"
Icon="/Assets/EMXControls.ico"
Title="Toolbars Sample"
Width="800" Height="600">
<mx:MxWindow.DataContext>
<vm:MainWindowViewModel/>
</mx:MxWindow.DataContext>
<mxb:ToolbarManager Name="toolbarManager1" IsWindowManager="True" >
<Grid RowDefinitions="Auto, *, Auto, *, Auto" ColumnDefinitions="Auto, *, Auto">
<mxb:ToolbarContainerControl DockType="Top" Grid.ColumnSpan="3">
<mxb:Toolbar x:Name="MainMenu" ToolbarName="Main Menu" DisplayMode="MainMenu" >
<mxb:ToolbarMenuItem Header="File" Category="File">
<mxb:ToolbarButtonItem Header="New"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/FileNew.svg'}"
Category="File"
Command="{Binding NewFileCommand}"/>
<mxb:ToolbarButtonItem Header="Open"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/FileOpen.svg'}"
Category="File"
Command="{Binding OpenFileCommand}"/>
<mxb:ToolbarButtonItem Header="Print"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/FilePrint.svg'}"
Category="File"
Command="{Binding PrintCommand}" ShowSeparator="True"/>
</mxb:ToolbarMenuItem>
<mxb:ToolbarMenuItem Header="Edit" Category="Edit" >
<mxb:ToolbarButtonItem Header="Cut"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditCut.svg'}"
Category="Edit"
Command="{Binding #textBox1.Cut}" IsEnabled="{Binding #textBox1.CanCut}"/>
<mxb:ToolbarButtonItem Header="Copy"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditCopy.svg'}"
Category="Edit"
Command="{Binding #textBox1.Copy}" IsEnabled="{Binding #textBox1.CanCopy}"/>
<mxb:ToolbarButtonItem Header="Paste"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditPaste.svg'}"
Category="Edit"
Command="{Binding #textBox1.Paste}" IsEnabled="{Binding #textBox1.CanPaste}"/>
</mxb:ToolbarMenuItem>
<mxb:ToolbarButtonItem Header="About" Category="Options" ShowSeparator="True"
Alignment="Far" Command="{Binding AboutCommand}"/>
</mxb:Toolbar>
<mxb:Toolbar x:Name="EditToolbar" ToolbarName="Edit" ShowCustomizationButton="True" >
<mxb:ToolbarButtonItem Header="Cut" Command="{Binding #textBox1.Cut}"
IsEnabled="{Binding #textBox1.CanCut}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditCut.svg'}"
Category="Edit" ToolTip.Tip="Cut Selection"/>
<mxb:ToolbarButtonItem Header="Copy" Command="{Binding #textBox1.Copy}"
IsEnabled="{Binding #textBox1.CanCopy}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditCopy.svg'}"
Category="Edit"/>
<mxb:ToolbarButtonItem Header="Paste"
Command="{Binding #textBox1.Paste}"
IsEnabled="{Binding #textBox1.CanPaste}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditPaste.svg'}"
Category="Edit"
DropDownArrowVisibility="ShowArrow" DropDownArrowAlignment="Default">
<mxb:ToolbarButtonItem.DropDownControl>
<mxb:PopupMenu>
<mxb:ToolbarButtonItem Header="Paste"
Command="{Binding #textBox1.Paste}"
IsEnabled="{Binding #textBox1.CanPaste}"/>
<mxb:ToolbarButtonItem Header="Paste As"
Command="{Binding PasteAsCommand}"
IsEnabled="{Binding #textBox1.CanPaste}"/>
</mxb:PopupMenu>
</mxb:ToolbarButtonItem.DropDownControl>
</mxb:ToolbarButtonItem>
</mxb:Toolbar>
<mxb:Toolbar x:Name="FontToolbar" ToolbarName="Font" ShowCustomizationButton="True" >
<mxb:ToolbarCheckItem Header="Bold"
IsChecked="{Binding #textBox1.FontWeight,
Converter={view:BoolToFontWeightConverter}, Mode=TwoWay}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/FontBold.svg'}"
Category="Font"/>
<mxb:ToolbarCheckItem Header="Italic"
IsChecked="{Binding #textBox1.FontStyle,
Converter={view:BoolToFontStyleConverter}, Mode=TwoWay}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/FontItalic.svg'}"
Category="Font"/>
<mxb:ToolbarEditorItem Header="Font:" IsVisible="" EditorWidth="150" Category="Font"
EditorValue="{Binding #textBox1.FontFamily,
Converter={view:FontNameToFontFamilyConverter}}">
<mxb:ToolbarEditorItem.EditorProperties>
<mxe:ComboBoxEditorProperties
ItemsSource="{Binding $parent[view:MainWindow].Fonts}"
IsTextEditable="False" PopupMaxHeight="145"/>
</mxb:ToolbarEditorItem.EditorProperties>
</mxb:ToolbarEditorItem>
</mxb:Toolbar>
</mxb:ToolbarContainerControl>
<mxb:ToolbarContainerControl DockType="Left" Grid.Row="1" Grid.Column="0"
Grid.RowSpan="3">
<mxb:Toolbar x:Name="TextEditingToolbar" ToolbarName="Text Editing"
ShowCustomizationButton="True" >
<mxb:ToolbarButtonItem Header="Undo" HotKeyDisplayString="Ctrl+Z"
Command="{Binding #textBox1.Undo}" IsEnabled="{Binding #textBox1.CanUndo}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditUndo.svg'}"
Category="Edit"/>
<mxb:ToolbarButtonItem Header="Redo" HotKeyDisplayString="Ctrl+Y"
Command="{Binding #textBox1.Redo}" IsEnabled="{Binding #textBox1.CanRedo}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditRedo.svg'}"
Category="Edit"/>
<mxb:ToolbarButtonItem Header="Clear" Command="{Binding #textBox1.Clear}"
HotKey="Ctrl+Q"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditDelete.svg'}"
Category="Edit"/>
</mxb:Toolbar>
</mxb:ToolbarContainerControl>
<TextBox Grid.Row="1" Grid.Column="1" x:Name="textBox1" Text="Text Editor"
AcceptsReturn="True" CornerRadius="0" FontFamily="Arial" FontSize="20">
<mxb:ToolbarManager.ContextPopup>
<mxb:PopupMenu ShowIconStrip="True" Header="Text Box Menu" ShowHeader="True">
<mxb:ToolbarButtonItem Header="Undo" HotKeyDisplayString="Ctrl+Z"
Command="{Binding #textBox1.Undo}" IsEnabled="{Binding #textBox1.CanUndo}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditUndo.svg'}"
Category="Edit"/>
<mxb:ToolbarButtonItem Header="Redo" HotKeyDisplayString="Ctrl+Y"
Command="{Binding #textBox1.Redo}" IsEnabled="{Binding #textBox1.CanRedo}"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditRedo.svg'}"
Category="Edit"/>
<mxb:ToolbarSeparatorItem/>
<mxb:ToolbarButtonItem Header="Clear" Command="{Binding #textBox1.Clear}"
HotKeyDisplayString="Ctrl+Q" Category="Edit"
Glyph="{SvgImage 'avares://Bars-sample/Images/Toolbars/EditDelete.svg'}"/>
</mxb:PopupMenu>
</mxb:ToolbarManager.ContextPopup>
</TextBox>
<mxb:ToolbarContainerControl DockType="Standalone" Grid.Row="2" Grid.Column="1">
<mxb:Toolbar x:Name="TextEditor2Toolbar" ToolbarName="Standalone Toolbar"
ShowCustomizationButton="True" AllowDragToolbar="true" >
<mxb:ToolbarButtonItem Header="Select All"
Command="{Binding #textBox2.SelectAll}" Category="TextEditor2 Toolbar"/>
<mxb:ToolbarButtonItem Header="Make Toolbar Floating"
Command="{Binding $parent[view:MainWindow].MakeToolbar2Floating}"
ShowSeparator="True"
Category="TextEditor2 Toolbar"/>
</mxb:Toolbar>
</mxb:ToolbarContainerControl>
<TextBox x:Name="textBox2" Grid.Row="3" Grid.Column="1" Text="Text Editor #2"
AcceptsReturn="True" CornerRadius="0" FontFamily="Arial" FontSize="20"/>
<mxb:ToolbarContainerControl DockType="Right" Grid.Row="1" Grid.Column="2"
Grid.RowSpan="3"/>
<mxb:ToolbarContainerControl DockType="Bottom" Grid.Row="4" Grid.ColumnSpan="3">
<mxb:Toolbar DisplayMode="StatusBar" ToolbarName="Status Bar" x:Name="StatusBar">
<mxb:ToolbarTextItem Name="tbTextItem1" Alignment="Far"
ShowSeparator="True" ShowBorder="False" Category="Info"
CustomizationName="Position Info"
Header="{Binding $parent[view:MainWindow].LineNumber}"/>
</mxb:Toolbar>
</mxb:ToolbarContainerControl>
</Grid>
</mxb:ToolbarManager>
</mx:MxWindow>
App.axaml:
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Bars_sample.App"
xmlns:theme="clr-namespace:Eremex.AvaloniaUI.Themes.DeltaDesign;assembly=Eremex.Avalonia.Themes.DeltaDesign"
RequestedThemeVariant="Default">
<!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
<Application.Styles>
<theme:DeltaDesignTheme/>
</Application.Styles>
</Application>
MainWindow.axaml.cs:
using Avalonia;
using Avalonia.Controls;
using Eremex.AvaloniaUI.Controls.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Runtime.CompilerServices;
using Avalonia.Data.Converters;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
using System.Linq;
using CommunityToolkit.Mvvm.Input;
namespace Bars_sample.Views;
public partial class MainWindow : MxWindow, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
textBox1.PropertyChanged += TextBox_PropertyChanged;
}
private void TextBox_PropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
{
if (e.Property == TextBox.CaretIndexProperty)
{
NotifyPropertyChanged("LineNumber");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
IReadOnlyList<string> fonts;
public IReadOnlyList<string> Fonts => fonts ??
(
fonts = FontManager.Current.SystemFonts.Select(x => x.Name).OrderBy(x => x).ToList()
);
[RelayCommand]
public void MakeToolbar2Floating()
{
TextEditor2Toolbar.DockType = Eremex.AvaloniaUI.Controls.Bars.MxToolbarDockType.Floating;
TextEditor2Toolbar.FloatingPosition = new PixelPoint(200, 200);
}
public string LineNumber
{
get
{
TextBox textBox = this.textBox1;
string text = textBox.Text;
string newLine = textBox.NewLine;
int currentIndex = 0;
int lineNumber = 0;
while (currentIndex <= textBox.CaretIndex)
{
lineNumber++;
int newLineIndex = 1;
if(text!=null) newLineIndex = text.IndexOf(newLine, currentIndex);
if (newLineIndex >= 0)
currentIndex = newLineIndex + newLine.Length;
else
break;
}
return "Line Number: " + lineNumber;
}
}
}
public class BoolToFontWeightConverter : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((FontWeight)value) == FontWeight.Bold;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? FontWeight.Bold : FontWeight.Normal;
}
}
public class BoolToFontStyleConverter : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (FontStyle)value == FontStyle.Italic;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? FontStyle.Italic : FontStyle.Normal;
}
}
public class FontNameToFontFamilyConverter : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((FontFamily)value).Name;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return new FontFamily((string)value);
}
}
MainWindowViewModel.cs:
using CommunityToolkit.Mvvm.Input;
namespace Bars_sample.ViewModels;
public partial class MainWindowViewModel : ViewModelBase
{
[RelayCommand]
void About()
{
}
[RelayCommand]
void NewFile()
{
}
[RelayCommand]
void OpenFile()
{
}
[RelayCommand]
void Print()
{
}
}
Смотрите также¶
- Панели инструментов
- Всплывающие и контекстные меню
- Элементы панели инструментов
- Сериализация панели инструментов
* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.