Как заставить группу выключателей действовать как переключатели в WPF?

У меня есть группа кнопок, которые должны действовать как выключатели, но также и как переключатели, где только одна кнопка может быть нажата / придавленный в текущее время. Это также должно иметь состояние, где ни одна из кнопок не нажимается / придавленный.

Поведение будет отчасти похоже на панель инструментов Photoshop, где нуль или один из инструментов выбраны в любое время!

Какая-либо идея, как это может быть реализовано в WPF?

117
задан code-zoop 2 March 2010 в 11:08
поделиться

4 ответа

Самый простой способ - стилизовать 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.

39
ответ дан 24 November 2019 в 02:00
поделиться

вы можете поместить в нее сетку с радиокнопками и создать кнопку как шаблон для радиокнопок. чем просто программно удалить, проверьте, не хотите ли вы переключать кнопки

4
ответ дан 24 November 2019 в 02:00
поделиться

Вы также можете попробовать 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;
 }
3
ответ дан 24 November 2019 в 02:00
поделиться

вы всегда можете использовать общее событие по щелчку кнопки 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
ответ дан 24 November 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: