У меня по нажатию кнопки должно менять цвет каждой цифры в Label
. До этого делал 4 Label
и по очереди менял их цвет но это очень крупно получается. Можно ли в моей ситуации как-ни-будь попроще или это единственный вариант?
Вот как делал раньше. Тут каждый Label
это своя цифра, а я бы хотел в один Label
все 4 цифры. Они разделены пробелом:
Label[] labels = {label1,label2,label3,label4};
int labelsCounter = 0;
private void NextApproach_Click(object sender, RoutedEventArgs e)
{
labels[labelsCounter].Foreground = Brushes.LightCoral;
labelsCounter++;
if (labelsCounter == labels.Length)
{
//SomeCode
}
}
Вот как один из вариантов с привязками и MVVM*:
Создадим базовый класс для реализации INotifyPropertyChanged
public class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Создадим VM нашего числа, которая будет содержать в себе само число, цвет и простой метод для сброса цвета на стандартное:
public class Number : BaseViewModel
{
public Number(int numb)
{
Numb = numb;
Color = Brushes.Black;
}
private int numb;
private Brush color;
public int Numb
{
get => numb;
set
{
numb = value;
OnPropertyChanged();
}
}
public Brush Color
{
get => color;
set
{
color = value;
OnPropertyChanged();
}
}
public void ClearColor() => Color = Brushes.Black;
}
Далее нам нужна сама коллекция, которую мы заполним нашими цифрами:
public ObservableCollection<Number> Numbers { get; set; } = new ObservableCollection<Number>
{
new Number(1),
new Number(2),
new Number(3),
new Number(4)
};
Я лично размещаю эту коллекцию прям в MainWindow
(но лучше все разделять на отдельные VM слои) и по этому как DataContext
я укажу окно:
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
Далее нам нужен функционал кнопки. Для изменения значений по очереди, нам понадобится какой нибудь счетчик, простое число. Также для удобства (что бы не вычислять позже) мы вынесем отдельно еще и предыдущее, "покрашенное" нами число:
private int current;
private Number prev;
Теперь код самого действия:
Skip()
(который пропустит определенное число объектов) и FirstOrDefault()
(который возьмет первый, подходящий нам элемент).null
, то выполняем сброс цвета.null
(то есть найдена), меняем ей цвет и сохраняем ее для будущего изменения.Код всего MainWindow
в итоге будет следующим:
public partial class MainWindow : Window
{
public ObservableCollection<Number> Numbers { get; set; } = new ObservableCollection<Number>
{
new Number(1),
new Number(2),
new Number(3),
new Number(4)
};
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
private int current;
private Number prev;
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
var next = Numbers.Skip(current).FirstOrDefault();
prev?.ClearColor();
if (next != null)
{
next.Color = Brushes.Red;
prev = next;
}
current = current < Numbers.Count-1 ? current + 1 : 0;
}
}
StackPanel
, которая позволяет нам разместить рядом контролы. В нее помещаем кнопку и ItemsControl
.ItemsControl
- простейший вывод нашей коллекции так, как нам захочется. С помощью ItemsPanel
задаем отображение элементов построчно, а с помощью ItemTemplate
мы задаем вид каждого элемента.В итоге получаем следующее:
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<ItemsControl ItemsSource="{Binding Numbers}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Numb}" Foreground="{Binding Color}" FontSize="25"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button Content="Сменить" Click="ButtonBase_OnClick"/>
</StackPanel>
Запускаем и любуемся результатом:
*Я не буду реализовывать тут команды и отдельный VM для основной логики. Так что это почти правильный MVVM. В реальном проекте стоит задуматься над реализацией команд, а не использовать Click
!
Просто немного поправлю код, чтобы не переживать за значение labelsCounter
Label[] labels = {label1,label2,label3,label4};
int labelsCounter = 0;
private void NextApproach_Click(object sender, RoutedEventArgs e)
{
labels[labelsCounter].Foreground = Brushes.LightCoral;
labelsCounter = (labelsCounter+1) % labels.length;
}
Теперь можно нажимать кнопку сколько хочешь, labelsCounter
никогда не выйдет за рамки массива labels
;
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
После переноса с локалхост все мапршруты ведет на главную, даже не существующиеВ логах пусто
Всем добрый день! Есть таблица, база данных, и при загрузке страницы можно в коде задать параметр за каким будут выведены результаты (ORDER BY ******...
Необходимо парсить сайт, но проблема в том, что доступ к нему только при поднятом впнСкрипт будет выполняться на сервере на Debian
Хочу сделать правильноЗадумано, что можно создавать страницы на сайте через панель администратора