У меня есть группа кнопок, которые должны действовать как выключатели, но также и как переключатели, где только одна кнопка может быть нажата / придавленный в текущее время. Это также должно иметь состояние, где ни одна из кнопок не нажимается / придавленный.
Поведение будет отчасти похоже на панель инструментов Photoshop, где нуль или один из инструментов выбраны в любое время!
Какая-либо идея, как это может быть реализовано в WPF?
Самый простой способ - стилизовать ListBox для использования ToggleButton для его ItemTemplate
<Style TargetType="{x:Type ListBox}">
<Setter Property="ListBox.ItemTemplate">
<Setter.Value>
<DataTemplate>
<ToggleButton Content="{Binding}"
IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"
/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
Затем вы можете использовать свойство SelectionMode ListBox для обработки SingleSelect vs MultiSelect.
вы можете поместить в нее сетку с радиокнопками и создать кнопку как шаблон для радиокнопок. чем просто программно удалить, проверьте, не хотите ли вы переключать кнопки
Вы также можете попробовать System.Windows.Controls.Primitives.ToggleButton
<ToggleButton Name="btnTest" VerticalAlignment="Top">Test</ToggleButton>
Затем напишите код для свойства IsChecked
, чтобы имитировать эффект радиокнопки
private void btnTest_Checked(object sender, RoutedEventArgs e)
{
btn2.IsChecked = false;
btn3.IsChecked = false;
}
вы всегда можете использовать общее событие по щелчку кнопки ToggleButton, которое устанавливает для всех ToggleButton.IsChecked в групповом элементе управления (Grid, WrapPanel, ...) значение false с помощью VisualTreeHelper; затем повторно проверьте отправителя. Или что-то в этом роде.
private void ToggleButton_Click(object sender, RoutedEventArgs e)
{
int childAmount = VisualTreeHelper.GetChildrenCount((sender as ToggleButton).Parent);
ToggleButton tb;
for (int i = 0; i < childAmount; i++)
{
tb = null;
tb = VisualTreeHelper.GetChild((sender as ToggleButton).Parent, i) as ToggleButton;
if (tb != null)
tb.IsChecked = false;
}
(sender as ToggleButton).IsChecked = true;
}