Мне нужно изменить цвет фона кнопки с помощью ListBox. У меня есть 3 ListBoxItems для 3 цветов (зеленый, желтый и красный). Я не знаю, как это сделать. Любая помощь будет оценена.
<StackPanel Grid.Column = "1" Grid.Row = "3">
<ToggleButton Height = "50" Content = "Change!" Name = "button">
</ToggleButton>
<Popup IsOpen = "{Binding IsChecked, ElementName=button}" StaysOpen = "False">
<Border Background = "LightYellow">
<ListBox>
<ListBoxItem>Green</ListBoxItem>
<ListBoxItem>Yellow</ListBoxItem>
<ListBoxItem>Red</ListBoxItem>
</ListBox>
</Border>
</Popup>
</StackPanel>
Дайте вашему ListBox имя и прикрепите обработчик событий SelectionChanged
.
<ToggleButton Height = "50" Content = "Change!" Name = "button">
<ListBox x:Name = "myListBx" SelectionChanged = "MyListBx_OnSelectionChanged">
<ListBoxItem>Green</ListBoxItem>
<ListBoxItem>Yellow</ListBoxItem>
<ListBoxItem>Red</ListBoxItem>
</ListBox>
Затем на задней панели вы можете сделать что-то вроде этого (проверено работает)
private void MyListBx_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
string SelectedColor = (myListBx.SelectedItem as ListBoxItem).Content.ToString();
switch (SelectedColor)
{
case "Yellow":
button.Background = Brushes.Yellow;
break;
case "Green":
button.Background = Brushes.Green;
break;
case "Pink":
button.Background = Brushes.Pink;
break;
}
}
Используйте обработчик событий Выбор изменен в элементе управления ListBox, как показано ниже:
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var listBoxItem = ((sender as ListBox).SelectedItem as ListBoxItem);
button.Background = (SolidColorBrush)new BrushConverter().ConvertFromString(listBoxItem.Content.ToString());
}
Вот мое решение с использованием конвертера. Преобразователь примет строковое значение, а затем вернет цвет, см. ниже.
public class StringToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var listItem = value as ListBoxItem;
if (listItem != null)
{
var text = listItem.Content;
switch (text)
{
case "Green":
return new SolidColorBrush(Colors.Green);
case "Yellow":
return new SolidColorBrush(Colors.Yellow);
case "Red":
return new SolidColorBrush(Colors.Red);
}
}
return new SolidColorBrush(Colors.Transparent);
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Вы допустили ошибку в своем xaml, потому что не можете напрямую изменить фон переключателя. Ниже показано, как использовать конвертер с вашим фактическим кодом. Обратите внимание, что это изменит только фон текстового блока. чтобы кнопка выглядела лучше Пожалуйста, смотрите здесь
<StackPanel>
<Popup IsOpen = "{Binding IsChecked, ElementName=button}" StaysOpen = "False">
<Border Background = "LightYellow">
<ListBox x:Name = "ColorPicker">
<ListBoxItem>Green</ListBoxItem>
<ListBoxItem>Yellow</ListBoxItem>
<ListBoxItem>Red</ListBoxItem>
</ListBox>
</Border>
</Popup>
<ToggleButton Name = "button"
Height = "50"
>
<TextBlock Text = "Change!" Background = "{Binding Source = {x:Reference ColorPicker}, Path=SelectedValue, Converter = {StaticResource StringToColorConverter}}"/>
</ToggleButton>
</StackPanel>
Вот решение, которое не использует код программной части. Он связывается со списком. Без всплывающего окна он отображается лучше, так как вам придется убрать фокус с кнопки, чтобы увидеть изменения во всплывающем окне.
<StackPanel Grid.Column = "1" Grid.Row = "3">
<ToggleButton Height = "50" Content = "Change!" Name = "button">
<ToggleButton.Background>
<Binding ElementName = "lb" Path = "SelectedItem.Content" />
</ToggleButton.Background>
</ToggleButton>
<Popup IsOpen = "{Binding IsChecked, ElementName=button}" StaysOpen = "False">
<Border Background = "LightYellow">
<ListBox Name = "lb" >
<ListBoxItem>Green</ListBoxItem>
<ListBoxItem>Yellow</ListBoxItem>
<ListBoxItem>Red</ListBoxItem>
</ListBox>
</Border>
</Popup>
</StackPanel>
Удалите строки <Popup IsOpen = "{Binding IsChecked, ElementName=button}" StaysOpen = "False">
и </Popup>
, которые поместят список прямо под кнопку. Это немедленно покажет изменение цвета.
Вы также можете сделать что-то подобное с DataTrigger
<StackPanel Grid.Row = "2">
<Popup IsOpen = "{Binding IsChecked, ElementName=button}" StaysOpen = "False">
<Border Background = "LightYellow">
<ListBox x:Name = "ColorPicker" >
<ListBoxItem>Green</ListBoxItem>
<ListBoxItem>Yellow</ListBoxItem>
<ListBoxItem>Red</ListBoxItem>
</ListBox>
</Border>
</Popup>
<ToggleButton Name = "button"
Height = "50">
<TextBlock Text = "Change!" >
<TextBlock.Style>
<Style TargetType = "TextBlock">
<Style.Triggers>
<DataTrigger Binding = "{Binding ElementName=ColorPicker,Path=SelectedIndex}" Value = "0">
<Setter Property = "Background" Value = "Green"></Setter>
</DataTrigger>
<DataTrigger Binding = "{Binding ElementName=ColorPicker,Path=SelectedItem}" Value = "1">
<Setter Property = "Background" Value = "Yellow"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</ToggleButton>
</StackPanel>