Как сделать панель инструментов wpf

Обновлено: 06.07.2024

Я хотел бы иметь настраиваемые панели инструментов в своем приложении, как те, которые предлагает Visual Studio 2008 (щелкните правой кнопкой мыши на панели инструментов, настройка). Мне нужно решение WPF, и я не смог его найти (ни на SO, ни в Google). Я действительно нашел эту запись в блоге Visual Studio 2010, которая подразумевает, что даже у Microsoft были некоторые проблемы с этим. Так или иначе, чтобы все было просто, вопрос в том, существует ли какой-либо фреймворк с открытым исходным кодом/free, который предоставляет эту функциональность (он не должен быть точной копией решения VS2008).

2 ответа

Как я могу сделать плавающую панель инструментов (например, плавающую панель инструментов мини-шрифта в Word 2007) с помощью WPF? Я бы хотел, чтобы он появлялся и исчезал при движении мыши над предметами. Спасибо Вопрос

Я создал приложение для камеры для iPhone, и теперь я сижу и полирую последний из них. Мое приложение - это приложение для коллажей, в котором пользователь может делать несколько снимков подряд. Как и сегодня, у меня есть настроенный вид камеры, который содержит один UIButton для съемки снимков и.

Я просто немного поиграл, и я думаю, что будет относительно легко реализовать желаемое поведение только с WPF (не требуется дополнительная библиотека или фреймворк). Я включил пример кода для добавления Button к ToolBar , который, в свою очередь, позволяет добавлять больше кнопок на панель инструментов.

Чтобы получить желаемое поведение, у меня была бы коллекция кнопок для панели инструментов и другая коллекция с доступными кнопками. Панели инструментов ItemsSource будут привязаны к первой коллекции. После нажатия кнопки "customize" в контекстном меню я просто покажу другую форму с двумя ListViews (каждый привязан к одной из коллекций) и кнопками для добавления/удаления кнопок из полной коллекции в/из коллекции панелей инструментов. HTH.

Поскольку ToolBar-это ItemsControl, вы можете попробовать использовать фреймворки перетаскивания для достижения желаемого.

Это отличное решение для обработки элементов, связанных с данными. Вам нужно будет немного настроить код, если вы не используете data binding для отображения элементов ToolBar (хотя я предлагаю вам использовать data binding', это значительно упростит сохранение настроек).

Когда вы нажмете "customize" в своем приложении, вы можете открыть ListBox с доступными элементами (он должен быть в том же окне, чтобы вышеприведенное решение работало) и включить drag-and-drop из/в ToolBars и ListBox, используя прикрепленное свойство.

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

Я начинаю с WPF и хотел бы показать панель инструментов Word 2007, как при выборе текста в текстовом редакторе. Панель инструментов выглядит следующим образом : текст.

Попытка представить длинный текст в форме WPF и действительно похожей на возможности, открываемые FlowDocument. Моя проблема в том, что он автоматически показывает панель инструментов. Кто-нибудь.

Я новичок в wpf. Я должен создать плавающий ToolBar в wpf, как панель инструментов ms - office 2003. Так что я могу разместить его где угодно сверху вниз, слева направо, как это было в office 2003.

Как я могу сделать плавающую панель инструментов (например, плавающую панель инструментов мини-шрифта в Word 2007) с помощью WPF? Я бы хотел, чтобы он появлялся и исчезал при движении мыши над.

Я создал приложение для камеры для iPhone, и теперь я сижу и полирую последний из них. Мое приложение - это приложение для коллажей, в котором пользователь может делать несколько снимков подряд. Как.

У этого вопроса есть решение: Как скрыть строки меню WPF DocumentViewer's? Однако он позволяет скрыть панель инструментов только через XAML. Мне нужно сделать это программно. Этот ответ: WPF.

Я новичок в wpf. Мне нужно создать плавающий ToolBar в wpf, как панель инструментов ms - office 2003. Чтобы я мог разместить его в любом месте сверху вниз, влево-вправо так же, как и в офисе 2003 года.

Пожалуйста, помогите мне .

Для простой стыковки вы должны использовать DockPanel :

Вместо кнопки вы, конечно, будете использовать классы, которые более подходят для ваших нужд.

Однако, когда вам нужна оконная система с плавающими окнами, вам придется вернуться к сторонней библиотеке, потому что у нее нет WPF, и было бы довольно сложно свернуть ее. Вот несколько библиотек:

Если вам действительно нужна плавающая панель для стыковки (и никаких других окон), вы можете использовать ToolBar class в сочетании с класс ToolBarTray . Но вам нужно будет написать код, чтобы обнаружить перетаскивание, удалить элемент ToolBar из визуального дерева, а затем добавить его как корневую визуализацию в свой собственный Window или HwndSource. Затем вам нужно будет определить, когда окно находится над вашей зоной перетаскивания, чтобы переместить панель инструментов из окна в визуальное дерево главного окна и закрыть другое окно.

Я новичок в wpf. Я должен создать плавающий ToolBar в wpf как панель инструментов ms - office 2003. Так что я могу разместить его в любом месте сверху вниз, слева направо так же, как это было в Office 2003.

Пожалуйста, помогите мне.

3 ответа

Я рекомендую вам посмотреть на сторонние библиотеки управления для этого. Syncfusion - это коммерческий продукт, который содержит компонент менеджера док-станции в своей коллекции основных инструментов. Это не совсем похоже на офис 2k3 (больше похоже на Visual Studio). Есть также один на codeplex, и я уверен, что есть несколько других в различных ценовых диапазонах.

Я полагаю, что для фактического открепления панелей инструментов от основной области панели инструментов стандартные элементы управления панели инструментов WPF уже поддерживают это. По крайней мере, вы можете перемещать их внутри панели инструментов.

Для простой стыковки вы должны использовать DockPanel:

Вместо кнопки вы, конечно, будете использовать классы, которые больше соответствуют вашим потребностям.

Однако, когда вам нужна система управления окнами с плавающими окнами, вам придется вернуться к сторонней библиотеке, потому что в WPF ее нет, и вам будет довольно сложно свернуть свою собственную. Вот несколько библиотек:

  • SandDock (не бесплатно)
  • WPF Docking lib
  • WPF Docking Control (не бесплатно)
  • Авалон Док
  • Док и MDI для WPF (не бесплатно)
  • Диспетчер стыковки (не бесплатно)

Если все, что вам действительно нужно - это плавающая панель инструментов (и никаких других окон), вы можете использовать класс ToolBar вместе с классом ToolBarTray. Но вам нужно будет написать код для обнаружения перетаскивания, удалить элемент ToolBar из дерева визуалов, а затем добавить его в качестве корневого визуала в ваш собственный Window или HwndSource. Затем вам нужно будет определить, когда окно находится над вашей рабочей зоной, чтобы переместить панель инструментов из окна в визуальное дерево главного окна и закрыть другое окно.

В процессе выполнения работы необходимо разработать страничное/оконное WPF приложение .

Задание 1. Создать проект в соответствии с шаблоном "приложение WPF" и разработать интерфейс пользователя – 1 час

Для разработки приложения необходимо создать WPF-проект ( рис. 6.1). В окне " Создать проект " необходимо проверить установку библиотеки .NET Framework 4 (1 – на рис. 6.1), выбрать шаблоны Windows (2 – на рис. 6.1), а среди имеющихся шаблонов задать Приложение WPF и в поле " Имя " ввести имя проекта WpfApplProject.

Окно создания проекта

После нажатия кнопки "ОК" будет сформирован шаблон проекта. При этом инструментальная система сгенерирует следующий XAML -документ:

Дизайнер проекта приведен на рис. 6.2.

Окно дизайнера проекта

В приведенном XAML -документе имеется один элемент верхнего уровня . Дескриптор завершает весь документ. В XAML -документе приведено имя класса MainWindow

Каждый атрибут соответствует определенному свойству класса Window. Приведенные атрибуты предписывают WPF создать окно с надписью MainWindow и размером 350х525 единиц. При компиляции и запуске проекта приложения на дисплей выводится окно, приведенное на рис. 6.3.

Окно MainWindow проекта

Когда выполняется компиляция приложения, XAML - файл , который определяет пользовательский интерфейс ( MainWindow.xaml ), транслируется в объявление типа CLR , которое объединяется с логикой приложения из файла класса отдельного кода ( MainWindow.xaml.cs ).

Метод InitializeComponent() генерируется во время компиляции приложения и в исходном коде не присутствует.

Для программного управления элементами управления, описанными в XAML -документе, необходимо задать XAML атрибут Name. Так для задания имени элементу Grid необходимо записать следующую разметку:

  • NavigationWindow, который представляет собой несколько видоизмененную версию класса Window ;
  • Frame, находящийся внутри другого окна или другой страницы;
  • Frame, обслуживаемый непосредственно в Internet Explorer.

Для вставки страницы внутрь окна будем использовать класс Frame ( рис. 6.4). Автоматически будет сгенерирован экземпляр класса Frame с фиксированными границами рис. 6.5).

Выбор класса Frame в панели инструментов

Фрейм с фиксированными границами

В XAML -документ проекта будет добавлена следующая строка:

С учетом того, что создается страничное приложение размеры фрейма не нужно фиксировать, поэтому изменим описание свойств фрейма:

В результате фрейм заполнит всё окно ( рис. 6.6):

Фрейм, заполняющий всё окно

Созданный фрейм необходим для размещения в нем страницы WPF-приложения. Класс Page допускает наличие только одного вложенного элемента. Он не является элементом управления содержимым и наследуется от класса FrameworkElement. Класс Page имеет небольшой набор дополнительных свойств, которые позволяют настраивать его внешний вид, взаимодействовать с контейнером и использовать навигацию. Для перехода на другую страницу необходимо использовать навигацию.

Меню создания страницы

Окно Добавления нового элемента

В дизайнере проекта сгенерируется страница PageMain.xaml ( рис. 6.9).

Дизайнер страницы PageMain.xaml

В сгенерированной странице в качестве контейнера верхнего уровня используется Grid. Замените Grid на контейнер StackPanel.

Главная страница приложения в дизайнере представлена на рис. 6.10.

Главная страница WPF-приложения в дизайнере

Измените свойство Title окна класса Window, в соответствии с вариантом лабораторной работы.

Основная страница должна обеспечивать переход на другие страницы, обеспечивающие инферфейс для отдельных функций и выход из системы. Для перехода на другие страцицы используйте гиперссылки. Гиперссылки позволяют пользователю перемещаться с одной страницы на другую. Элемент гиперссылки, соответствующий объекту класса Hyperlink, определяется следующей строкой:

Класс Hyperlink имеет свойство NavigateUri. Данное свойство определяет на какую страницу будет переходить приложение при щелчке на соответствующей гиперссылке. Например, NavigateUri="Page2.xaml".

В WPF гиперссылки являются не отдельными, а внутристроковыми потоковыми элементами, которые должны размещаться внутри другого поддерживающего их элемента. Это можно сделать, например в элементе TextBlock, который для гиперссылки является контейнером.

На первой странице создайте гиперссылки для перехода на страницы приложния, в соответствии в заданием.

Создание основного меню. Создайте основное меню с помощью класса Menu, который представляет Windows элементы управления меню , позволяющие иерархически организовать элементы, связанные с командами и обработчиками событий. Меню формируют из объектов MenuItem (имя пункта меню ) и Separator (разделитель). Класс MenuItem имеет свойство Header, которое определяет текст элемента меню . Данный класс может хранить коллекцию объектов MenuItem, которая соответствует подпунктам меню . Класс Separator отображает горизонтальную линию, разделяющую пункты меню .

Добавьте в StackPanel страницы приложения XAML - описание меню , которое на верхнем уровне будет содержать, например два пункта Действие и Отчет. Пункт Действие включает подпункты Отменить, Создать, Редактировать, Сохранить, Найти и Удалить. Между пунктами Отменить, Создать и пунктами Найти, Удалить добавьте разделительные линии.

Создание панели инструментов. Панель инструментов представляет специализированный контейнер для хранения коллекции элементов, обычно кнопок. Расположите в панели инструментов кнопки, функциональное назначение которых будет соответствовать подпунктам меню Действие, то есть Отменить, Создать, Редактировать, Сохранить, Найти и Удалить.

На лицевой стороне кнопок поместите графическое изображение соответствующего действия. Для этого добавьте в файл проекта папку Images и в неё включите графические объекты, которые можно найти в библиотеке графических объектов Visual Studio ( папка VS2010ImageLibrary).

После добавления графических файлов в проект они будут отображены в обозревателе решений ( рис. 6.11).

Включение в проект папки Images с файлами рисунков

Для каждой кнопки задайте свойство Name – имя объекта в программе и свойство ToolTip с текстом всплывающей подсказки при наведении указателя мыши на кнопку.

Свойство Margin определяет внешние отступы для кнопки. Задание графического объекта для кнопки осуществляется определением для объекта Image источника Source, который должен соответствовать полному пути к графическому файлу.

Проектирование интерфейсных элементов. При проектировании интерфейсных элементов для страницы приложения используются элементов контроля ListBox, ListView, TextBox, TextBlock, ComboBox, DataGrid и других.

Класс DataGrid представляет элемент управления, отображающий данные в настраиваемой сетке строк и столбцов. По умолчанию DataGrid автоматически создает столбцы, на основе источника данных. При этом генерируются следующие типы столбцов:

  • DataGridTextColomn – для отображения в ячейках столбцов текстового содержимого;
  • DataGridCheckBoxColomn – для отображения в ячейках столбцов логических данных;
  • DataGridComboBoxColomn – для отображения в ячейках столбцов данных, когда имеется набор элементов для выбора;
  • DataGridHyperlinkColomn – для отображения в ячейках столбцов элементов Uri.

Если разработчика не устраивает автоматическая генерация столбцов DataGrid можно её отключить. Для этого свойству AutoGenerateColumns необходимо присвоить значение false. Далее можно создать собственный набор столбцов ( Columns ), используя существующие типы столбцов или создать новый тип столбца с помощью шаблона DataGridTemplateColumn.

DataGrid поддерживает множество способов настройки отображения данных.

Во вложенном WPF ToolBarPanel-ToolBar-Menu мы хотим избавиться от ручки захвата слева и области переполнения справа. они оба неактивны, но мы бы хотели, чтобы они вообще не отображались.

какие-нибудь идеи о том, как это сделать?

на случай, если мои термины не совсем верны, если вы посмотрите на изображение на рисунке 3 ссылки ниже, на самой нижней из трех панелей инструментов есть ручка слева от раскрывающегося списка и справа от самого правого кнопка есть переполнение.

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

Вы можете поместить Margin = "0,0, -14,0" на ToolBar, чтобы убрать правую сторону из поля зрения. Это самое простое решение, которое я нашел, но я тестировал только одну ToolBar, а не внутри ToolBarPanel или ToolBarTray.

Захват можно удалить, установив присоединенное свойство ToolBarTray.IsLocked="True" на панели инструментов.

Чтобы удалить ToggleButton переполнения , вам нужно будет удалить его в настраиваемом ControlTemplate, как предлагает шестизначные переменные, что, если у вас есть blend или вы можете загрузить предварительный просмотр Blend 3, не слишком сложно.

Вы также можете просто скрыть кнопку в загруженном событии ToolBar, хотя какой бы маршрут вы ни выбрали, вы также должны установить прикрепленное свойство ToolBar.OverflowMode="Never" в меню ToolBar, чтобы элементы не могли случайно переполниться в недоступную область.

И установите Overflow ToggleButton в свернутое положение:

Напрашивается вопрос: зачем вообще использовать ToolBar? Почему бы просто не использовать простую панель StackPanel с кнопками? Какие преимущества дает ToolBar?

Отвечая Джошу Джи: Если вы используете прозрачную кнопку с изображением на обычной панели (StackPanel и т. Д.), Она будет иметь белый контур. Однако, когда та же кнопка размещается на панели инструментов, белого контура нет.

Это также полезно, если вы хотите тематизировать панель инструментов в этом контексте, например, при наведении курсора мыши.

К вашему сведению: вы можете использовать простую панель StackPanel и при этом получить стиль панели инструментов.

Кроме того, я обнаружил, что если вы не хотите использовать элемент управления на панели инструментов, свойство ToolBar.OverflowMode = "Never" можно установить непосредственно внутри элемента управления на панели инструментов. Это создало эффект, который я искал

Теперь вы будете редактировать шаблон элемента управления для ToolBarPanel и можете установить видимость Collapsed для сигнала захвата и переполнения. Вы можете промыть и повторить для других элементов управления. Это немного отнимает много времени, но с Blend не так уж и сложно.

Спасибо за информацию. к сожалению, blend2 и vs2008, похоже, не очень хорошо работают вместе для нас, слишком много проблем, когда один работает с кодом, сгенерированным в другом, поэтому в настоящее время мы не позволяем blend приближаться к нашему коду vs;)

Я думаю, что в новом XAML Power Toys добавлена ​​функция, позволяющая группировать элементы управления. (Может быть, это MoXAML Power Toys . )

Читайте также: