Как сделать поиск wpf

Обновлено: 08.07.2024

В WPF существует возможность создавать приложения с возможность навигации, то есть с использованием Navigation объектов, таких как Page, NavigationService и NavigationWindow. Большинство примеров на MSDN отображает, как использовать такие объекты в XBAP приложениях, но никто не запрещает нам и создавать клиентские приложения с использованием навигации по страницам.

Итак, постараемся создать такое приложение. Создаем новый WPF Application проект, оттуда удаляем созданное Window1.xaml, добавляем две страницы FirstPage.xaml и SecondPage.xaml, а так же прописываем в App.xaml файл страницу, с которой наше приложение будет стартовать:

После запуска мы должны увидеть окно нашего приложения, содержащее навигационную панель с кнопками перехода вперед и назад. Дальше, нам необходимо создать ссылки, которые помогали бы переходить с одной страницы на другую. Это можно сделать разными способами.

Добавим в проект UserControl и назовем его ApplicationToolbar. Первая возможность, при помощи которой мы сможем осуществлять переход между страницами это использование NavigationService, создадим для этого метод обработки нажатий на кнопки со следующим кодом:

Метод осуществляет переход на страницу, которая указана в параметрах команды. В xaml файле контрола ApplicationToolbar создадим команду, привяжем к ней данный метод и укажем кнопкам данную команду на выполнение:

Таким образом мы создали панель с кнопками перехода между страницами. Можно пользоваться и более простым решением - Hyperlink, давайте добавим и его на наш контрол:

Итак, в результате мы должны получить, приблизительно, следующий вид окна:

Untitled

Тут возникает следующее желание, положить наш контрол ApplicationToolbar на NavigationWindow (там, где располагаются навигационные кнопки). Сделать нам это поможет возможность переопределение стилей в WPF. А именно переопределение стиля для NavigationWindow.

Для того, чтобы описать новый стиль для NavigationWindow, а точнее переписать существующий, нам изначально необходимо вытащить стиль из библиотек PresentationFramework. Вообще у PresentationFramework есть несколько наборов тем, таких как Classic, Aero, Royale и Luna, каждая тема лежит в отдельной библиотеке. Я буду рассматривать библиотеку PresentationFramework.Aero с ее темой. Для того, чтобы посмотреть BAML файл (после компиляции файл xaml упаковывается в baml - Binary Application Markup) можно воспользоваться программой Reflector с плагином BamlViewer, но как показала практика - BamlViewer не очень хорошо справляется с декомпиляцией: он не верно прописывает имена ключей (Key), не верно расшифровывает данные Geometry, даже располагает описание триггеров перед описание контента стиля - из-за чего элементы в триггерах не находятся. В общем, лучше с задачей декомпиляции BAML справляется StyleExplorer. Вот небольшой скриншот сравнения данных программ:

Untitled2

Самое интересное, что значение ключей стилей действительно такими и являются как видно на скриншоте - x:Key="Ì". То есть в своих стилях мы можем ссылаться на стиль с именем ключа Ì (если стиль подключили). Почему сделаны такие странные имена ключей - не понятно (и видно так же, что BAML Viewer не верно их распознает). В итоге, Style Explorer предоставляет нам реально работающий XAML текст - мы можем к примеру перенести к себе в проект весь XAML текст и он будет валиден, чего не скажешь о BAML Viewer. Но весь XAML нам не нужен. Нам интересно переписать представление NavigationWindow, для этого мы изначально создадим в нашем проекте новый файл ресурсов Themes/General.xaml (имя файла и каталог можно выбрать любыми). Чтобы наш файл ресурсов был доступен в приложении - мы должны его так же подключить в файле App.xaml, это делается так:

В файле General.xaml мы так же должны подключить файл ресурсов из библиотеки PresentationFramework.Aero, чтобы мы могли в стиле нашего будущего NavigationManager использовать уже существующие стили от темы Aero. Делается это таким же способом:

Далее из Style Explorer копируем стиль для NavigationWindow, а так же его ContentTemplate (который используется в стиле). ContentTemplate мы немного изменим, а точнее добавим наш контрол ApplicationToolbar в него, больше ничего делать не будем. Заметим, что ссылки на ресурсы вида ì, d, ê остаются и они будут работать. В результате у нас должен получится, приблизительно, такой набор стилей (большую часть закомментировал, там все остается то, что дал нам Style Explorer):

В результате наше приложение будет выглядеть следующим образом:

Untitled3

Как видим, мы добились того, что наш контрол ApplicationToolbar теперь располагается на навигационной панели.

See Also

Found a misprint? Feel free to send a Pull Request or open an issue.

Have a question about the post? You tried, something does not work? GitHub discussions.

В предыдущей статье мы рассмотрели структуру проекта. Проект можно скачать по ссылке GitHub.

Создание класса главного окна (MainWindow Page Object)

Класс MainWindow.cs представляет главное окно нашего приложения WPF (имейте в виду, что подаю урезанный код. Полный код можно скачать с репозитория по ссылке выше).

MainWindow согласно паттерну проектирования Page Object. Обьекты (элементы) являются приватными (private) свойствами. Действия над ними – публичные (public) методы, которые используются и вызываються в блоках кода тестов.

Как говорилось ранее – основная идея этого паттерна,- предотвращение дублирования кода для более гибкой поддержкт фреймворка автоматизации.

Класс MainWindow расширяет XamlElementContainer, который реализован фреймворком Telerik. Для поиска элементов WPF приложения используется следующий метод типа TControl, который реализует класс XamlElementContainer:

Альтернативный вариант реализации MainWindow

Вместо наследования от класса XamlElementContainer можно просто передать обьект VisualFind конструктору MainWindow и искать элементы следующим образом.

Как находить элементы написано в этой статье article.

XamlPath

Как вы могли заметить я использую метод XamlPath find для поиска элементов и простоты в обслуживании. Синтаксис XamlPath довольно похож на синтаксис XPath. Главное отличие индексы элементов основаны на нулевых значениях (Button[0] – определяет первый обьект кнопки). Самая сложная часть в автоматизации – поиск XamlPath. Я нашел следующий инструмент для его определения WPF Inspector. Он предоставляет всю необходимую информацию о структуре приложения WPF.

WPF Inspector

1xmlpath

Это скриншот поиска XamlPath для кнопки “Browse”. Если вам покажется сложным поиск с помощью WPF Inspector, то можно воспользоваться другими инструментами.

Все элементы главного окна в классе MainWindow являются WPF-элементами, поэтому использование White ни к чему. В случае контролов WinForms, который появляется при выполнении действий над WPF-элементами вам следует передать обьект White в конструктор.

У меня есть DataGrid , привязанный к таблице базы данных, мне нужно получить содержимое выбранной строки в DataGrid , например, я хочу показать в MessageBox содержимое выбранной строки.

enter image description here

Итак, если я выберу вторую строку, мой MessageBox должен показать что-то вроде: 646 Jim Biology.

ОТВЕТЫ

Ответ 1

Вы можете использовать свойство SelectedItem чтобы получить выбранный в данный момент объект, который затем можно преобразовать в правильный тип. Например, если ваш DataGrid связан с коллекцией объектов Customer вы можете сделать это:

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

Ответ 2

Если вы используете шаблон MVVM, вы можете привязать свойство SelectedRecord вашей виртуальной машины с помощью SelectedItem DataGrid, таким образом, у вас всегда есть SelectedValue в вашей виртуальной машине. В противном случае вы должны использовать свойство SelectedIndex DataGrid.

Ответ 3

Ответ 4

Это довольно просто в этом DataGrid dg, и класс item заполняется в datagrid, а listblock1 является базовым фреймом.

Ответ 5

Вы также можете:

Ответ 6

Хорошо, я поставлю аналогичное решение, которое отлично работает для меня.

Ответ 7

Ответ 8

Только что открыл это после того, как я попросил Fara ответить, но он не работал над моим проектом. Просто перетащите столбец из окна Источники данных и перейдите в Label или TextBox.

Ответ 9

используйте класс Model для получения значений строк, выбранных из datagrid, например

Ответ 10

если я выберу вторую строку -

noteText будет 646. Это VB, но вы его получите.

Ответ 11

@Krytox ответ с MVVM

Ответ 12

Это дает мне первый столбец в выбранной строке. Надеюсь, это поможет кому-то еще.

Ответ 13

Я не могу комментировать напрямую, поэтому я проверил ответ и проголосовал за показ идеи

Но то, что происходит, - то, что, в то время как я прокручиваю, выбранная строка неоднократно обнаруживается, я думаю из-за подхода ContainerFromItem .

Я попытался немного поиграть с выбранным индексом, и это не так просто, как в WindowsForms . Итак, я попытался выяснить, как выполнить выделение.

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

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

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

На первой странице создадим следующие гиперссылки: Сотрудники, Клиенты, Договора, Ценные бумаги, Сделки и Справка. XAML -описание гиперссылки для страницы Сотрудники приведено ниже.

Для реализации функциональности первого окна WPF-приложения осталось добавить кнопку выхода.

Результат компиляции и выполнения WPF-приложения приведен на рис. 4.12.

Начальная страница WPF-приложения с гиперссылками

По условию учебного примера будем постепенно добавлять функциональность приложения в части обработки данных по сотрудникам компании.

Создадим страницу с именем PageEmployee. В качестве основного контейнера будем использовать панель StackPanel. Определим для неё градиентную заливку, аналогичную начальной странице приложения.

Проектирование интерфейса

В WPF можно создать основное и контекстное меню . Кроме того, можно создать панель инструментов с кнопками, которые будут реализовывать функциональность, аналогичную пунктам меню .

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

Запустим приложение и выберем ссылку Сотрудники на странице PageEmployee. При выборе пункта меню Действие появляется выпадающий список и пунктами подменю ( рис. 4.13).

Главное меню страницы PageEmployee

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

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

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

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

Теперь можно разработать XAML -описание панели инструментов для страницы PageEmployee.

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

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

В дизайнере Visual Studio страница PageEmployee примет вид, приведенный на рис. 4.15.

После запуска приложения и выборе кнопки панели инструментов Добавить ( Add ) страница PageEmployee будет иметь вид, приведенный на рис. 4.16.

Следующим шагом проектирования интерфейсных элементов для страницы PageEmployee является решение задачи формирования отображения данных по сотрудникам предприятия. Данная задача может быть решена различными способами: с помощью элементов контроля ListBox, ListView, TextBox, TextBlock, ComboBox, DataGrid и других.

В учебном примере будем использовать элемент контроля DataGrid для табличного отображения данных о сотрудниках. В качестве заголовка таблицы применим текстовый блок " Список сотрудников".

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

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

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

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

XAML -документ описания интерфейсных элементов страницы PageEmployee имеет следующий вид.

Для полей Фамилия, Имя, Отчество, Телефон и Электронная почта используется тип столбца DataGridTextColumn. Так как должность сотрудника задается в соответствии с данными из справочника базы данных , то есть предоставляется список , из которого можно произвести выбор, для данного столбца используется тип DataGridComboBoxColumn. Для столбца Дата рождения используется специфичный шаблон , то есть тип DataGridTemplateColumn, который будет описан позднее.

С учетом добавленных интерфейсных элементов страница PageEmployee в дизайнере примет вид, приведенный на рис. 4.17.

После запуска приложения страница PageEmployee будет иметь вид, приведенный на рис. 4.18

На данном этапе проектирования приложения на странице PageEmployee размещены все необходимые элементы контроля.

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