Как получить группу переключающих кнопок, которые будут действовать как переключатели в WPF?
У меня есть группа кнопок, которые должны действовать как кнопки переключения, но также и как радиокнопки, где можно выбрать или нажать только одну кнопку в текущее время. Он также должен иметь состояние, в котором ни одна из кнопок не выбрана/нажата.
Поведение будет выглядеть как панель инструментов Photoshop, где в любой момент выбираются нуль или один из инструментов!
Любая идея, как это можно реализовать в WPF?
Ответы
Ответ 1
Самый простой способ - создать ListBox для использования ToggleButtons для 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.
Ответ 2
Это самый простой способ, на мой взгляд.
<RadioButton Style="{StaticResource {x:Type ToggleButton}}" />
Наслаждайтесь!
- Pricksaw
Ответ 3
<RadioButton Content="Point" >
<RadioButton.Template>
<ControlTemplate>
<ToggleButton IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/>
</ControlTemplate>
</RadioButton.Template>
</RadioButton>
он работает для меня, наслаждайтесь!
Ответ 4
вы всегда можете использовать общее событие в клике 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;
}
Ответ 5
вы можете поместить в него сетку с помощью радиообъектов и создать кнопку, подобную шаблону для raduiobuttons. чем просто programmaticaly удалить проверку, если вы не хотите, чтобы кнопки были переключены
Ответ 6
Вы также можете попробовать 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;
}
Ответ 7
Эй, я на самом деле разработал для этого решение. Вы можете переопределить шаблон управления для переключателей и поместить кнопки вниз. У меня есть реализованное решение в библиотеке с открытым исходным кодом здесь:
http://code.google.com/p/phoenix-control-library/
Вы можете получить рабочее решение для использования вне коробки или взглянуть на исходный код.
Enjoy.
Ответ 8
Я сделал это для RibbonToggleButtons, но, возможно, он одинаковый для обычных ToggleButtons.
Я привязал IsChecked для каждой кнопки к значению перечисления "mode" с помощью EnumToBooleanConverter здесь Как связать RadioButtons с перечислением? (Укажите значение перечисления для этого элемента с помощью ConverterParameter. У вас должно быть одно значение перечисления для каждой кнопки)
Затем, чтобы предотвратить снятие отметки с уже отмеченной кнопки, поместите это в свой код для события Click для каждого из кнопок RibbonToggleButtons:
private void PreventUncheckRibbonToggleButtonOnClick ( object sender, RoutedEventArgs e ) {
// Prevent unchecking a checked toggle button - so that one always remains checked
// Cancel the click if you hit an already-checked button
var button = (RibbonToggleButton)sender;
if( button.IsChecked != null ) { // Not sure why checked can be null but that fine, ignore it
bool notChecked = ( ! (bool)button.IsChecked );
if( notChecked ){ // I guess this means the click would uncheck it
button.IsChecked = true;
}
}
}
Ответ 9
Чтобы помочь людям вроде Джулиана и меня (две минуты назад...). Вы можете получить из RadioButton
, как это.
class RadioToggleButton : RadioButton
{
protected override void OnToggle()
{
if (IsChecked == true) IsChecked = IsThreeState ? (bool?)null : (bool?)false;
else IsChecked = IsChecked.HasValue;
}
}
Затем вы можете использовать его как Uday Kiran предлагаемый...
<Window x:Class="Sample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Sample"
Title="MainWindow" Height="600" Width="600">
<StackPanel>
<local:RadioToggleButton Content="Button" Style="{StaticResource {x:Type ToggleButton}}" />
</StackPanel>
</Window>
Этот метод позволяет одновременно использовать только один ToggleButton
Checked
, а также позволяет выполнять удаление.