Как сделать переключение между listbox c wpf
Перейти к содержимому

Как сделать переключение между listbox c wpf

  • автор:

WPF Как сделать ListBox c фреймами

Хочу сделать Total Commander. Для большей гибкости хочу чтобы списки с файлами было любое количество. Для этого решил сделать список из фреймов.

">      " Source="/TotalCommander;component/View/FileBrowser.xaml"/>  

введите сюда описание изображения

Но ничего не вышло. Если в качестве содержимого DataTemplate сделать содержимое фрейма

      . тело фрейма Grid и т.д.   

введите сюда описание изображения

Получается рванье которое на которое можно только смотреть. Ничего нельзя нажимать. Подскажите как быть.

Отслеживать
задан 23 сен 2018 в 15:39
лалала лала лалала лала
145 9 9 бронзовых знаков

В WPF элемент Frame — весьма специфический и предназначен немного для других целей. Вам лучше вынести все, что нужно по своему UserControl и в последующем использовать их. Если хотите к примеру одному элементу сделать разный вид (другой UserControl ), то задайте DataTemplate , а если хотите сделать что то по типу страниц, то сделайте свойство, которое будет содержать текущий VM и его привяжите к ContentPresenter (пример). В общем, отказывайтесь от Frame , мой вам совет.

23 сен 2018 в 15:59

@EvgeniyZ Сделал через UserControl, но элементы не реагируют на нажатия. Думаю это из-за того что они в ListBox. Может подскажете как решить эту проблему.

Как сделать переключение между listbox c wpf

ishyfaq.ru

WPF (Windows Presentation Foundation) — это технология разработки Windows-приложений, которая позволяет создавать интерактивные и эстетичные пользовательские интерфейсы. Одной из наиболее часто используемых элементов управления в WPF является ListBox.

ListBox представляет собой список элементов, которые можно выбрать один или несколько одновременно. Иногда требуется иметь возможность переключаться между разными ListBox-ами на одной форме или странице. Для этого можно использовать WPF-элемент управления TabControl.

TabControl позволяет размещать содержимое в виде вкладок, при этом каждая вкладка представляет собой отдельный контейнер для пользовательского интерфейса. В качестве содержимого для каждой вкладки можно выбрать ListBox. Таким образом, можно создать несколько вкладок с разными ListBox-ами и переключаться между ними, чтобы отображать соответствующие списки элементов.

Для создания переключения между ListBox с помощью TabControl нужно сначала добавить TabControl на форму или страницу WPF-приложения. Затем, внутри TabControl, создать несколько вкладок (TabItem) и добавить ListBox в качестве содержимого каждой вкладки. Затем можно установить заголовок для каждой вкладки, чтобы делать его более понятным для пользователя.

Основные понятия

В данной статье мы рассмотрим переключение между элементами списка (listbox) с помощью WPF.

  1. WPF (Windows Presentation Foundation) — это фреймворк для построения пользовательских интерфейсов в Windows-приложениях. Он предоставляет различные инструменты и функции для создания графических элементов, а также возможности для взаимодействия с ними и обработки событий.
  2. Listbox — элемент управления WPF, предназначенный для отображения списка элементов. Он позволяет показывать несколько элементов одновременно и выбирать один или несколько из них. Listbox может быть связан с коллекцией элементов, что позволяет автоматически обновлять список при изменении данных.
  3. Переключение между элементами listbox — это возможность выбирать один из элементов списка. Когда пользователь кликает на элемент, он становится выбранным, а остальные элементы выделены или неактивны. Переключение может происходить как по клику мыши, так и с помощью клавиатуры (например, клавишами стрелок или клавишами Tab и Shift+Tab).

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

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

Инструкция по созданию переключения между ListBox с помощью WPF

WPF (Windows Presentation Foundation) — это технология, разработанная компанией Microsoft, которая позволяет создавать пользовательский интерфейс для Windows-приложений. В этой инструкции мы рассмотрим, как создать переключение между ListBox с помощью WPF.

  1. Создайте новый проект WPF в выбранной вами среде разработки (например, Visual Studio).
  2. Добавьте элемент управления ListBox на главное окно вашего приложения. Для этого откройте файл MainWindow.xaml и добавьте следующий код:

В этом случае мы создаем TextBlock для отображения выбранного элемента.

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)

ListBoxItem selectedItem = listBox.SelectedItem as ListBoxItem;

В этом случае мы получаем выбранный элемент ListBox и отображаем его содержимое в TextBlock.

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

Примеры использования

Ниже приведены несколько примеров использования переключения между ListBox с помощью WPF.

    Простое переключение Данный пример демонстрирует основное переключение между двумя ListBox .

Первый ListBox

  • Элемент 1
  • Элемент 2
  • Элемент 3

Второй ListBox

Первый ListBox

  • Элемент 1
  • Элемент 2
  • Элемент 3

Второй ListBox

  • Новый элемент 1
  • Новый элемент 2
  • Новый элемент 3

Первый ListBox

  • Элемент 1
  • Элемент 2
  • Элемент 3

Второй ListBox

Плюсы и минусы переключения между ListBox

Использование переключения между ListBox в WPF имеет свои плюсы и минусы. Ниже представлен список преимуществ и недостатков данного подхода.

Плюсы:

  1. Простота использования. Переключение между ListBox в WPF реализуется без особых усилий, используя стандартные элементы управления.
  2. Привлекательный внешний вид. Возможность создавать различные стили и шаблоны для элементов ListBox позволяет создавать красивые и интуитивно понятные интерфейсы.
  3. Гибкость. Переключение между ListBox позволяет свободно переключаться между различными наборами данных и удобно отображать большие объемы информации.
  4. Обработка событий. Возможность привязывать обработчики событий к элементам в ListBox позволяет реагировать на различные пользовательские действия.
  5. Удобство навигации. Прокручивание элементов и переход между ListBox с помощью клавиш клавиатуры значительно упрощает навигацию по большим спискам.

Минусы:

  • Ограничения по месту на экране. Если число элементов в ListBox слишком велико, то может потребоваться много места на экране, что может создать проблемы для устройств с маленькими дисплеями.
  • Сложность реализации определенной логики. Некоторые операции, такие как сортировка или фильтрация элементов, могут потребовать дополнительного программного кода для их реализации.
  • Возможность выбора только одного элемента одновременно. По умолчанию ListBox позволяет выбирать только один элемент, что может быть неудобно в некоторых ситуациях, когда требуется множественный выбор.
  • Недостаточная индикация выбранного элемента. При большом числе элементов в ListBox может быть сложно определить, какой элемент был выбран, особенно если нет явной визуальной индикации.
  • Ограниченный набор элементов управления. В ListBox доступен только стандартный набор элементов управления, что может ограничить возможности пользовательского интерфейса.

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

Рекомендации

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

1. Используйте правильную структуру данных

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

2. Применяйте правильный шаблон отображения

ListBox в WPF имеет возможность определять пользовательский шаблон отображения элементов списка. Используйте эту возможность для создания красивого и информативного отображения данных. Вы можете определить собственный шаблон или использовать готовые варианты из библиотеки стилей.

3. Обработайте событие выбора элемента

ListBox предоставляет событие, которое срабатывает, когда пользователь выбирает элемент в списке. Воспользуйтесь этим событием для выполнения дополнительных действий при выборе элемента. Например, вы можете отобразить подробную информацию о выбранном элементе или выполнить дополнительные операции над ним.

4. Обеспечьте удобную навигацию в списке

ListBox может содержать большое количество элементов, и важно обеспечить удобную навигацию в списке. Используйте возможности ListBox для прокрутки списка, поиска элементов и фильтрации. Также можно предоставить пользователю возможность сортировки элементов по различным критериям.

5. Оптимизируйте производительность

Если у вас есть большое количество элементов в ListBox, обратите внимание на производительность. Используйте виртуализацию элементов для отображения только видимых элементов списка. Также можно применить некоторые оптимизации для ускорения работы с большими объемами данных.

Следуя этим рекомендациям, вы сможете создать удобное и функциональное переключение между ListBox с помощью WPF.

Выводы

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

Основным компонентом для создания переключения между элементами ListBox является свойство SelectedItem. Оно позволяет получать выбранный элемент из списка и использовать его для вывода информации.

Мы также рассмотрели пример привязки свойства SelectedItem к элементу TextBlock, чтобы выводить информацию о выбранном элементе на экране.

Для более сложных сценариев, связанных с переключением между элементами ListBox, мы также можем использовать событие SelectionChanged, которое срабатывает при изменении выбранного элемента. Это позволяет выполнять дополнительные операции, например, обновление других элементов пользовательского интерфейса.

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

Вопрос-ответ

Как создать переключение между listbox с помощью WPF?

Для создания переключения между ListBox в WPF вы можете использовать элемент управления TabControl. TabControl предоставляет вкладки, между которыми пользователь может переключаться. Вы можете разместить ListBox на каждой вкладке и настроить вкладки так, чтобы они реагировали на событие изменения текущей вкладки. Таким образом, при переключении пользователь будет видеть разные ListBox в зависимости от выбранной вкладки.

Как сделать переключение между listbox c wpf

Как обработать множественный выбор в ListBox WPF C#?

Каким образом можно обработать множественный выбор элементов в ListBox, т.к SelectionIndexChanged срабатывает только при выборе одного элемента в ListBox?

Отслеживать
задан 5 дек 2020 в 20:17
Сергей Машенцев Сергей Машенцев
55 6 6 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Ну вот вам пример.

 " SelectionMode="Multiple" Name="LB"/> 
public partial class MainWindow : Window < public MainWindow() < InitializeComponent(); DataContext = new[] < 1, 2, 3, 4, 5 >; OnSelectionChanged(null, null); > void OnSelectionChanged(object sender, SelectionChangedEventArgs e) < var selectedItems = LB.SelectedItems.Cast(); var s = string.Join(", ", selectedItems); if (s == "") s = "(none)"; TB.Text = $"Selected items: "; >> 

Получается вот что:

Если вы используете MVVM и хотите обрабатывать выделение на уровне VM, лучше завести свойство IsSelected в ItemVM , переопределить стиль контейнера

и подписаться на изменение IsSelected в ItemVM . Но это может оказаться и не вполне хороший путь, т. к. выбранные элементы всё же визуальное свойство.

Перемещение объектов между двумя Listbox

Author24 — интернет-сервис помощи студентам

Как реализовывается функционал перемещение объекта из одного списка в другую. Допустим, имеется класс. У него есть свойства. И на странице 2 списка, необходимо при нажатии на кнопку, происходил переброс выбранного объекта из одного списка в другой, и наоборот.
Сталкивался с проблемой, что не отображалось, и не обновлялась view часть. Либо, объект перемещался, но в предыдущем листе оставался (использовал Observablecollection).
Ниже представлю скрин примера интерфейса.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Сравнение строк между двумя ListBox
Здравствуйте! Подскажите пожалуйста, как сделать поиск, для сравнения по двум ДатаГридВью, если.

Создать зависимость между двумя ComboBox/ListBox
Как сделать так, чтобы содержимое выпадающего списка второго ComboBox-а(ListBox-a) зависело от.

Перемещение элементов между двумя listBox
Как переместить выделенный элемент одного listbox в другой при помощи кнопки. namespace Dekanat23.

Возможно ли перетаскивание элементов (drag/drop) внутри listbox и между двумя listbox?
Подскажите возможно ли перетаскивание элементов внутри listbox и между двумя listbox, если возможно.

2149 / 1530 / 307
Регистрация: 14.08.2018
Сообщений: 5,088
Записей в блоге: 4
Aigulik, Как вариант удалить,

FirstCollection.Remove(SelectedFirstItem)

, выбранный объект из первой коллекции, и во вторую добавить новый объект

1 2 3 4 5
SecondCollection.Add(new MyClass  ID = SelectedFirstItem.ID, Name = SelectedFirstItem.Name >);

, созданный из первого. Тогда всё обновится само, если используется ObservableCollection .

Добавлено через 9 минут
Aigulik, Только вначале добавить, а потом удалить. Так надёжнее будет

Эксперт .NET

15246 / 10520 / 2753
Регистрация: 21.04.2018
Сообщений: 31,137
Записей в блоге: 2

ЦитатаСообщение от Aigulik Посмотреть сообщение

Сталкивался с проблемой.

Без кода трудно сказать в чём проблема.
По идее никакой проблемы не должно возникать.
Должно быть нечто подобное:

1 2 3 4 5
void MoveItem(SomeClass item)  FirstCollection.Remove(item); SecondCollection.Add(item); >

Если с перестраховкой то так:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
void MoveItem(SomeClass item)  for(int i = 0; i FirstCollection.Count; i++)  if(object.Equals(FirstCollection[i], item))  FirstCollection[i] = null; FirstCollection.RemoveAt(i); break; > > SecondCollection.Add(item); >

Но ошибки же могут быть не только в самом методе объявления.
Может быть неправильная привязка, может быть потеряна связь между коллекцией в VM и в View и другие причины.

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

Добавлено через 36 минут
Aigulik, ещё одна возможная причина — изменение коллекций в том же задании Диспетчера, в котором уже произошло измерение макета.
Такое вполне возможно, так как вы обрабатываете перенос элемента в событии из UI элемента.
Для устранения надо метод MoveItem передать в очередь Диспетчера отдельным заданием.
Если это происходит внутри VM, то в отдельном таске. Но в этом случае должна быть задана синхронизация привязок для обоих коллекций.

ListView

Класс ListView — это специализированный класс спискового типа, предназначенный для отображения различных представлений одних и тех же данных. Он особенно удобен, когда требуется создать представление, состоящее из множества столбцов и отображающее о каждом элементе данных несколько различных фрагментов информации.

Класс ListView унаследован от ListBox и дополняет его одной единственной деталью: свойством View. Свойство View представляет собой еще одну точку для создания многофункциональных списковых представлений. Если это свойство не установлено, элемент ListView ведет себя просто точно так же, как и его менее мощный предок — класс ListBox. Однако он становится гораздо более интересным, когда разработчик предоставляет объект представления, указывающий, каким должно быть форматирование и стили у элементов данных.

Формально свойство View указывает на экземпляр любого класса, унаследованного от ViewBase (который представляет собой абстрактный класс). Класс ViewBase удивительно прост: в действительности это не более чем оболочка, объединяющая вместе два стиля. Один из этих стилей применяется к элементу управления ListView (и указывается в свойстве DefaultStyleKey), в то время как другой применяется элементам внутри ListView (и указывается в свойстве ItemContainerDefaultStyleKey). Свойства DefaultStyleKey и ItemContainerDefaultStyleKey фактически стиль не предоставляют, а вместо этого они просто возвращают указывающий на него объект ResourceKey.

Сейчас наверняка интересно узнать, а зачем тогда вообще нужно свойство View — в конце концов, класс ListBox (как и все классы, унаследованные от ItemsControl) уже предлагает такие мощные возможности, как шаблоны данных и стили. Целеустремленные разработчики могут переделывать внешний вид элемента управления ListBox, предоставляя другой шаблон данных, другую панель компоновки и другой шаблон элемента управления.

Вообще говоря, для создания настраиваемых списков с множеством столбцов использовать класс ListView со свойством View необязательно. Точно такого же эффекта можно добиться и самостоятельно с помощью поддерживаемых классом ListBox шаблонов и стилей. Однако свойство View является полезной абстракцией. Ниже перечислены некоторые основные преимущества:

Представления, пригодные для многократного использования

ListView выделяет все касающиеся представления детали в один объект. Это упрощает создание представлений, не зависящих от данных и пригодных для применения с более чем одним списком.

Отделение элемента управления ListView от объектов View также упрощает переключение между множеством различных представлений в одном и том же списке. (Например, именно такая технология применяется в проводнике Windows для получения различных представлений файлов и папок пользователя.) Точно такую же функциональную возможность можно создать и за счет динамического изменения шаблонов и стилей, но построить единственный объект, инкапсулирующий все детали представления, все-таки гораздо легче.

Более удобная организация

Объект представления упаковывает два стиля: один для корневого элемента управления ListView и еще один — для отдельных элементов в списке. Поскольку эти стили упаковываются вместе, очевидно, что эти два фрагмента связаны между собой и могут разделять определенные детали и взаимозависимости. Например, для основанного на столбцах элемента управления ListView это имеет большой смысл, поскольку ему необходимо, чтобы размещение заголовков столбцов совпадало с размещением предназначенных для этих столбцов данных.

Применение этой модели открывает замечательные возможности для создания ряда полезных готовых представлений, которыми бы могли пользоваться все разработчики. К сожалению, в настоящее время в состав WPF входит пока только один объект представления — объект GridView. Хотя его можно и удобно использовать для построения списков с множеством столбцов, при наличии каких-то других потребностей придется создавать собственное специальное представление. В последующих разделах будет показано, как делать то и другое.

Элемент GridView будет замечательным выбором, если нужно, чтобы отображаемые данные можно было конфигурировать, а представление в стиле сетки было одной из доступных для пользователя опций. Но если требуется, чтобы в сетке дополнительно поддерживались расширенная стилизация, выбор или редактирование, придется перейти к использованию полнофункционального элемента управления DataGrid.

Создание столбцов с помощью GridView

— это класс, который наследуется от ViewBase и предоставляет списковое представление с множеством столбцов. Определяются эти столбцы путем добавления в коллекцию GridViewColumns объектов GridViewColumn.

GridView и GridViewColumn предлагают небольшой набор полезных методов, которые разработчик может использовать для настройки внешнего вида своего списка. Чтобы создать самый простой прямолинейный список (вроде Details (Список) в проводнике Windows), потребуется установить для каждого объекта GridViewColumn всего лишь два свойства: Header и DisplayMemberBinding. Свойство Header отвечает за размещаемый в верхней части столбца текст, а свойство DisplayMemberBinding содержит привязку, извлекающую из каждого элемента данных подлежащий отображению фрагмент информации.

Ниже приведен код разметки, необходимый для определения трех используемых в этом примере столбцов:

ListView на основе сетки

Здесь есть несколько важных моментов, на которые стоит обратить внимание. Во-первых, размер ни одного из столбцов не является жестко закодированным. Вместо этого GridView устанавливает размер столбцов в соответствии с размером самого широкого видимого элемента (или столбца заголовка, если тот занимает больше места в ширину), что вполне логично для основанного на гибкой компоновке мира WPF. (Конечно, при наличии огромных значений столбцов это немного усложняет дело. В таком случае можно попробовать упаковать текст).

Во-вторых, свойство DisplayMemberBinding устанавливается с использованием полнофункционального выражения привязки, которое поддерживает все возможности, в том числе форматирование строк и конвертеры значений.

Изменение размера столбцов

Изначально GridView делает каждый столбец настолько широким, насколько необходимо для того, чтобы в нем могло уместиться самое больше видимое значение. Однако размер любого столбца можно легко изменить, щелкнув и перетащив край его заголовка. Дважды щелкнув на крае заголовка столбца, можно заставить GridViewColumn изменить свой размер самостоятельно на основании какого-либо видимого в нем в текущий момент содержимого.

Например, в случае обнаружения при прокрутке списка вниз элемента, усеченного из-за несоответствия его размера ширине столбца, можно просто дважды щелкнуть на правом крае заголовка этого столбца, и столбец автоматически расширится должным образом.

Для более точного управления размером столбца при его объявлении можно указать конкретную ширину:

Это просто определяет начальный размер столбца. На возможность пользователя изменять размер столбца описанными выше способами это никак не влияет. К сожалению, свойства вроде MaxWidth и MinWidth класс GridViewColumn не поддерживает, так что ограничить пределы, до которых пользователь может изменять размеры столбцов, нельзя. Единственный вариант — предоставить новый шаблон для заголовка GridViewColumn и вообще отключить возможность изменения его размера.

Как сделать переключение между listbox c wpf

Кнопка поддерживает команды, и вместо обработки события Click мы можем прикрепить к ней команду. Но что делать, если элемент не поддерживает команду, а нам надо обработать какое-то его действие.

Например, у нас определен элемент ListBox, и мы хотим отслеживать выбор объекта в списке. Если бы мы использовали событийную модель, то мы бы обрабатывали событие SelectionChanged . Но мы знаем, что выделение объекта в списке ведет к изменению свойства SelectedItem элемента ListBox. Поэтому вместо применения события мы можем просто обрабатывать изменения свойства SelectedPhone в ApplicationViewModel, которое привязано к свойству SelectedItem у ListBox.

Аналогично у элемента TextBox есть событие TextChanged , которое вызывается при изменении вводимого текста. Но опять же изменение текста приводит к изменению свойства Text у элемента TextBox. Поэтому мы могли бы установить привязку для этого элемента к свойству Text:

А в классе Phone (либо в специальной ViewModel, которая инкапсулирует объект Phone) обрабатывать изменение свойства Title, которое бы синхронно менялось при вводе новых символов в текстовое поле:

public string Title < get < return phone.Title; >set < // обработка изменения свойства phone.Title = value; OnPropertyChanged("Title"); >>

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

В частности, нам надо добавить в проект через пакетный менеджер Nuget специальный пакет Microsoft.Xaml.Behaviors.Wpf :

Команды и события в WPF и C#

Пусть у нас в проекте есть следующая модель Phone :

using System.ComponentModel; using System.Runtime.CompilerServices; namespace HelloApp < public class Phone : INotifyPropertyChanged < private string title; private string company; private int price; public Phone(string title, string company, int price) < this.title = title; this.company = company; this.price = price; >public string Title < get < return title; >set < title = value; OnPropertyChanged("Title"); >> public string Company < get < return company; >set < company = value; OnPropertyChanged("Company"); >> public int Price < get < return price; >set < price = value; OnPropertyChanged("Price"); >> public event PropertyChangedEventHandler? PropertyChanged; public void OnPropertyChanged([CallerMemberName] string prop = "") < if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(prop)); >> >

Затем определим следующий класс ApplicationViewModel , который будет представлять ViewModel:

using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows.Input; namespace HelloApp < public class ApplicationViewModel : INotifyPropertyChanged < Phone? selectedPhone; public ObservableCollectionPhones < get; set; >// команда добавления нового объекта RelayCommand? addCommand; public RelayCommand AddCommand < get < return addCommand ?? (addCommand = new RelayCommand(obj =>< Phone phone = new Phone("", "", 0); Phones.Insert(0, phone); SelectedPhone = phone; >)); > > // команда удаления RelayCommand? removeCommand; public RelayCommand RemoveCommand < get < return removeCommand ?? (removeCommand = new RelayCommand(obj =>< Phone? phone = obj as Phone; if (phone != null) < Phones.Remove(phone); >>, (obj) => Phones.Count > 0)); > > RelayCommand? doubleCommand; public RelayCommand DoubleCommand < get < return doubleCommand ?? (doubleCommand = new RelayCommand(obj =>< Phone? phone = obj as Phone; if (phone != null) < Phone phoneCopy = new Phone(phone.Title, phone.Company, phone.Price); Phones.Insert(0, phoneCopy); >>)); > > public Phone? SelectedPhone < get < return selectedPhone; >set < selectedPhone = value; OnPropertyChanged("SelectedPhone"); >> public ApplicationViewModel() < Phones = new ObservableCollection< new Phone("iPhone 7", "Apple", 56000), new Phone("Galaxy S7 Edge", "Samsung", 60000), new Phone("Elite x3", "HP", 56000), new Phone("Mi5S", "Xiaomi", 35000) >; > public event PropertyChangedEventHandler? PropertyChanged; public void OnPropertyChanged([CallerMemberName] string prop = "") < if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(prop)); >> public class RelayCommand : ICommand < Actionexecute; Func? canExecute; public event EventHandler? CanExecuteChanged < add < CommandManager.RequerySuggested += value; >remove < CommandManager.RequerySuggested -= value; >> public RelayCommand(Action execute, Func? canExecute = null) < this.execute = execute; this.canExecute = canExecute; >public bool CanExecute(object? parameter) < return canExecute == null || canExecute(parameter); >public void Execute(object? parameter) < execute(parameter); >> >

Среди прочего здесь определена команда DoubleCommand, которая добавляет копию объекта в список.

Далее добавим в представление кнопку, которая будет вызывать данную команду. Но, допустим, мы хотим выполнять эту команду, если по кнопке был совершен двойной щелчок, то есть если произошло событие MouseDoubleClick :

     " /> " /> " />        " /> " /> " />   

Для добавленной кнопки устанавливается свойство Interaction.Triggers , которое позволяет связать триггеры событий с командами и передать этим командам параметры:

  

В файле связанного кода MainPage.xaml.cs определим привязку ApplicationViewModel к контексту страницы MainPage

using System.Windows; namespace HelloApp < public partial class MainWindow : Window < public MainWindow() < InitializeComponent(); DataContext = new ApplicationViewModel(); >> >

Теперь по двойному нажатию на эту кнопку произойдет дублирование в списке выделенного элемента:

Похожие публикации:

  1. Hp ledm что это
  2. Где скачать музыку в формате flac форум
  3. Как восстановить окно в экселе после сворачивания
  4. Скачать такое приложение где можно скачивать игры

Как сделать переключение между listbox c wpf

Рассмотрим, как мы можем взаимодействовать с несколькими окнами в WPF. Для этого создадим новый проект. По умолчанию он уже содержит одно главное окно MainWindow. Теперь добавим еще одно окно. Для этого в окне добавления нового элемента нам надо выбрать тип «Window (WPF)»:

Добавление окна в WPF

Назовем его TaskWindow .

Теперь определим на главном окне MainWindow кнопку для открытия нового окна:

Обработчик нажатия кнопки Button_Click будет выглядеть так:

private void Button_Click(object sender, RoutedEventArgs e)

Для открытия нового окна создаем его объект и затем вызываем метод Show() .

Взаимодействие между окнами в WPF

При нажатии на кнопку открывается окно TaskWindow.

Используя ссылку на окно, мы можем взаимодействовать с ним, например, передавать ему данные из главной формы или вызывать его методы. Например, изменим код C# класса TaskWindow:

using System.Windows; namespace WindowApp < public partial class TaskWindow : Window < public string ViewModel < get; set; >public TaskWindow() < InitializeComponent(); >public void ShowViewModel() < MessageBox.Show(ViewModel); >> >

Здесь добавлено свойство ViewModel и метод, который отображает его содержимое. Теперь изменим обработчик Button_Click в главном окне MainWindow:

private void Button_Click(object sender, RoutedEventArgs e)

Здесь у окна TaskWindow устанавливается свойство ViewModel и вызывается его метод.

Важно отметить, что после открытия эти окна существуют независимо друг от друга. Мы можем закрыть главное окно MainWindow, и второе окно TaskWindow все равно продолжит свою работу. Однако мы можем задать и другое поведение.

У всех окон есть свойство Owner , которое указывает на главное окно, владеющее текущим окном. Так, изменим обработчик Button_Click в главном окне:

private void Button_Click(object sender, RoutedEventArgs e) < TaskWindow taskWindow = new TaskWindow(); //Теперь MainWindow главное окно для taskWindow taskWindow.Owner = this; taskWindow.Show(); >

Теперь текущий объект MainWindow является владельцем taskWindow. Если, к примеру, мы закроем MainWindow, то закроется и TaskWindow.

Кроме того, мы можем обращаться из TaskWindow к своему владельцу:

public partial class TaskWindow : Window < public void ChageOwnerBackground() < this.Owner.Background = new SolidColorBrush(Colors.Red); >// остальной код >

С другой стороны все зависимые окна доступны в главном окне-владельце через свойство OwnedWindows :

private void Button_Click(object sender, RoutedEventArgs e) < TaskWindow taskWindow = new TaskWindow(); taskWindow.Owner = this; taskWindow.Show(); foreach(Window window in this.OwnedWindows) < window.Background = new SolidColorBrush(Colors.Red); if (window is TaskWindow) window.Title = "Новый заголовок!"; >>

Класс App и свойство Windows

Еще одним способ для взаимодействия с окнами предоставляет класс App — главный класс приложения. Он содержит свойство Windows , которое хранит информацию обо всех открытых окнах приложения. И в любом месте программы мы можем получить эту информацию:

foreach(Window window in App.Current.Windows) < window.Background = new SolidColorBrush(Colors.Red); // если окно - объект TaskWindow if (window is TaskWindow) window.Title = "Новый заголовок!"; >

Добавить комментарий

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