Расстояние между элементами ListBox
Желаемый результат выглядит так:
XAML:
C#: mass = new Rectangle[100]; for (int i = 0; i < Mass.Length; i++) < mass[i] = new Rectangle(); mass[i].VerticalAlignment = VerticalAlignment.Bottom; mass[i].Width = SList.ActualWidth / Mass.Length; mass[i].Height = (SList.ActualHeight - 100) * (i / 100.0); mass[i].Fill = Brushes.Green; mass[i].StrokeThickness = 1; mass[i].Stroke = Brushes.Black; SPName.Children.Add(mass[i]); >
При реализации через ListBox получается это:
XAML:
C#: Panel parent = ((sender as Button).Parent as Panel).Parent as Panel; mass = new Rectangle[100]; for (int i = 0; i < Mass.Length; i++) < mass[i] = new Rectangle(); mass[i].VerticalAlignment = VerticalAlignment.Bottom; mass[i].Width = parent.ActualWidth / Mass.Length; mass[i].Height = (parent.ActualHeight - 100) * (i / 100.0); mass[i].Fill = Brushes.Green; mass[i].StrokeThickness = 1; mass[i].Stroke = Brushes.Black; >OnPropertyChanged("Mass");
Как реализовать первый вариант с помощью ListBox?
Отслеживать
задан 27 фев 2018 в 20:53
лалала лала лалала лала
145 9 9 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Возможно, вам нужно это:
" Stroke="Black" StrokeThickness="1"/>
При этом ваш Mass имеет тип double[] или там IEnumerable и содержит нужные высоты прямоугольников.
Получается вот такой результат:
Если вам нужен ListView , вам придётся ещё подправить стиль контейнера:
" Stroke="Black" StrokeThickness="1"/>
Как добавить разделитель в ListBox при нажатий на кнопку
При нажатии на кнопку «Добавить» информация из TextBox должна добавляться в ListBox
1. Создать Windows Forms приложение 2. Добавить на форму TextBox 3. Добавить на форму ListBox.
При нажатии на кнопку Button в ListBox добавить строку, введенную в TextBox
как сделать так что бы при вводе текста в textbox при нажатии на кнопку button в listbox.
Как можно сделать, чтобы картинка крутилась при нажатий на кнопку?
Приветствую. Как можно сделать чтобы картинка крутился при нажатий на кнопку? Делаю игру "Поле.
Как добавить кнопку (или другой элемент) при нажатии на кнопку в JavaFX?
Как добавить кнопку (или другой элемент) при нажатии на кнопку в JavaFX? Как это можно осуществить.
15229 / 10347 / 2721
Регистрация: 21.04.2018
Сообщений: 30,659
Записей в блоге: 2
Wep, простой пример.
Если не сможете его применить, напишите в чём проблема — разберёмся.
Для начала простой базовый класс для элемента коллекции.
Свойства и другие члены для примера не важны — поэтому класс пустой.
Но в нём создаётся уникальный экземпляр, который будет ассоциироваться с разделителем:
1 2 3 4 5 6 7
namespace SeparatorInListBox { public class BaseItem { public static BaseItem Separator { get; } = new BaseItem(); } }
Так же понадобится селектор шаблонов.
Он создаётся как производный от класса DataTemplateSelector .
В классе два свойства получающие шаблоны для переключения и один метод.
В методе проверяется поступившее значение и на основе его анализа возвращается один из шаблонов, либо вызывается базовый метод.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
using System.Windows; using System.Windows.Controls; namespace SeparatorInListBox { public class SelectorTemplate : DataTemplateSelector { public DataTemplate BaseItemTemplate { get; set; } public DataTemplate SeparatorTemplate { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { if (Equals(item, BaseItem.Separator)) return SeparatorTemplate; if (item is BaseItem) return BaseItemTemplate; return base.SelectTemplate(item, container); } } }
Простейшая VM с одной коллекцией:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
using System.Collections.ObjectModel; namespace SeparatorInListBox { public class SeparatorViewModel { public ObservableCollectionBaseItem> Items { get; } = new ObservableCollectionBaseItem>() { new BaseItem(), BaseItem.Separator, new BaseItem(), new BaseItem(), BaseItem.Separator, new BaseItem(), new BaseItem(), new BaseItem(), BaseItem.Separator, new BaseItem(), }; } }
XAML Окна.
В ресурсах заданы два шаблона: один основной для вывода обычных элементов — высокий светлозелённый прямоугольник.
Второй для представления сепаратора — низкий светлосерый прямоугольник.
Создаётся экземпляр селектора шаблонов и в его свойства передаются шаблоны данных.
Так же определяется стиль для ListBox — его функция сделать недоступными для выбора сепараторы.
В ListBox уже всё просто — задаются привязки и значения к ранее созданным ресурсам.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
x:Class="SeparatorInListBox.TestSeparatorWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:SeparatorInListBox" mc:Ignorable="d" Title="TestSeparatorWindow" Height="450" Width="800"> > /> > > DataType="" x:Key="BaseItem.Default"> Height="30" Background="LightGreen"/> > DataType="" x:Key="BaseItem.Separator"> Height="10" Background="LightGray"/> > x:Key="SelectorTemplate" BaseItemTemplate="" SeparatorTemplate=""/> x:Key="ListBox.ItemStyle" TargetType="ListBoxItem"> > Binding="" Value=""> Property="IsEnabled" Value="False"/> > > > > > ItemsSource="" HorizontalContentAlignment="Stretch" ItemTemplateSelector="" ItemContainerStyle=""/> > >
Как сделать переключение между listbox c wpf
Кроме прямого добавления элементов в коллекцию Items компонентов ListBox и ComboBox мы также можем использовать механизм привязки данных.
Привязка данных в ListBox и ComboBox реализуется с помощью следующих свойств:
- DataSource : источник данных — какой-нибудь массив или коллекция объектов
- DisplayMember : свойство объекта, которое будет использоваться для отображения в ListBox / ComboBox
- ValueMember : свойство объекта, которое будет использоваться в качестве его значения
public partial class Form1 : Form < public Form1() < InitializeComponent(); Listphones = new List < new Phone < Name="Samsung Galaxy Ace 2", Year=2012>, new Phone < Name="Samsung Galaxy S4", Year=2013>, new Phone < Name="iPhone 6", Year=2014>, new Phone < Name="Microsoft Lumia 435", Year=2015>, new Phone < Name="Xiaomi Mi 5", Year=2015>>; listBox1.DataSource = phones; listBox1.DisplayMember = "Name"; listBox1.ValueMember = "Id"; listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged; > void listBox1_SelectedIndexChanged(object sender, EventArgs e) < // получаем id выделенного объекта int // получаем весь выделенный объект Phone phone = (Phone)listBox1.SelectedItem; MessageBox.Show(id.ToString() + ". " + phone.Name); >> class Phone < public int Id < get; set; >public string Name < get; set; >public int Year < get; set; >>
Итак, на форме у нас есть список ListBox с именем listBox1. В коде имеется класс Phone с тремя свойствами, объекты которого мы хотим выводить в список. В отличие от предыдущих тем эта задача сложнее, так как раньше мы выводили обычные строки, тут же у нас сложные объекты.
Для вывода используем механизм привязки. Сначала устанавливаем список телефонов в качестве источника данных:
listBox1.DataSource = phones;
Затем устанавливаем в качестве отображаемого свойства свойство Name класса Phone, а в качестве свойства значения — свойство Id:
listBox1.DisplayMember = "Name"; listBox1.ValueMember = "Id";
Значение отображаемого свойства мы затем увидим в списке. Оно будет представлять каждый отдельный объект Phone.
С помощью же свойства значения, которым является свойство Id, мы можем упростить работу с источником данных. В данном случае оно не играет большой роли. Но если бы мы использовали в качестве источника данных некоторый набор объектов из базы данных, то с помощью id нам было проще удалять, обновлять и взаимодействовать с базой данных.
И теперь если мы выделим какой-то объект, то свойство SelectedItem элементы ListBox будет содержать объект Phone, у которого мы можем получить значения свойств:
Phone phone = (Phone)listBox1.SelectedItem; string name = phone.Name;
А выделенное значение, то есть значение свойства Id выделенного телефона, будет находиться в свойстве SelectedValue .
И если мы запустим приложение, то увидим все отображаемые телефоны:
Все то же самое характерно и для элемента ComboBox. Пусть кроме ListBoxa на форме есть ComboBox:
public partial class Form1 : Form < public Form1() < InitializeComponent(); Listphones = new List < new Phone < Name="Samsung Galaxy Ace 2", Year=2012>, new Phone < Name="Samsung Galaxy S4", Year=2013>, new Phone < Name="iPhone 6", Year=2014>, new Phone < Name="Microsoft Lumia 435", Year=2015>, new Phone < Name="Xiaomi Mi 5", Year=2015>>; comboBox1.DataSource = phones; comboBox1.DisplayMember = "Name"; comboBox1.ValueMember = "Id"; comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged; listBox1.DisplayMember = "Name"; listBox1.ValueMember = "Id"; > void comboBox1_SelectedIndexChanged(object sender, EventArgs e) < Phone phone = (Phone)comboBox1.SelectedItem; listBox1.Items.Add(phone); >> class Phone < public int Id < get; set; >public string Name < get; set; >public int Year < get; set; >>
Здесь также для комбобокса устанавливается привязка, а также отображаемое свойство и свойство значения. Кроме того, здесь обрабатывается событие выбора элемента в комбобоксе так, чтобы выбранный элемент попадал в ListBox.
В отличие от ListBoxa ComboBox имеет три свойства для обработки выделенного объекта:
- SelectedItem : выбранный элемент
- SelectedValue : значение свойства значения, в данном случае свойство Id
- SelectedText : значение свойства отображение, в данном случае свойство Name класса Phone
Как сделать переключение между listbox c wpf
Рассмотрим, как мы можем взаимодействовать с несколькими окнами в WPF. Для этого создадим новый проект. По умолчанию он уже содержит одно главное окно MainWindow. Теперь добавим еще одно окно. Для этого в окне добавления нового элемента нам надо выбрать тип «Window (WPF)»:
Назовем его TaskWindow .
Теперь определим на главном окне MainWindow кнопку для открытия нового окна:
Обработчик нажатия кнопки Button_Click будет выглядеть так:
private void Button_Click(object sender, RoutedEventArgs e)
Для открытия нового окна создаем его объект и затем вызываем метод Show() .
При нажатии на кнопку открывается окно 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 = "Новый заголовок!"; >