powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Несколько ToggleButton
8 сообщений из 8, страница 1 из 1
Несколько ToggleButton
    #39530848
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно сделать такое: несколько ToggleButton, при чем одновременно может быть нажата или одна кнопка или ни одной. Если я делаю через RadioButton со стилем ToggleButton, то в пределах группы/панели работает половина из необходимого: одновременно будет нажата только одна кнопка. Но при этом "отщелкнуть" кнопку уже нельзя, чтобы ни одна не была нажата. Как такое сделать?

Еще хорошо бы, чтобы нажатие на любую кнопку инициировало событие клик или команду (MVVM). Или может быть как-то прикрутить enum со значениями по числу кнопок, а во ViewModel заиметь некое свойство - выбранный в данный момент режим (кнопка) или null, если все кнопки не нажаты. Тогда при изменении свойства можно было определять какой элемент из enum сейчас выбран и выполнять соответствующие действия. Как-то так, только не пойму, какой тут конвертер нужен.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public enum MyModes { Mode1, Mode2, ... };

public class ViewModel : ViewModelBase
{
    private WorkModes? _workMode;
    public WorkModes? WorkMode
    {
       get { return _workMode; }
       set
       {
          _workMode = value;
          OnPropertyChanged();
        }
    }
}



Код: xml
1.
2.
3.
4.
5.
<StackPanel Orientation="Horizontal">
    <ToggleButton Content="Режим 1" IsChecked="{Binding WorkMode, Converter={StaticResource MyConverter}, ConverterParameter={x:Static local:WorkModes.Mode1}}"/>
    <ToggleButton Content="Режим 2" IsChecked="{Binding WorkMode, Converter={StaticResource MyConverter}, ConverterParameter={x:Static local:WorkModes.Mode2}}"/>
    ...
</StackPanel>
...
Рейтинг: 0 / 0
Несколько ToggleButton
    #39530861
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1"отщелкнуть" кнопкуделать на чекбоксах, иначе пользователю не будет ясно, что можно "отщелкнуть"
Qwe.Qwe1какой тут конвертер нужен.Кастомный. При этом он же сможет отключать другие чекбоксы, когда включается какой-либо
...
Рейтинг: 0 / 0
Несколько ToggleButton
    #39530886
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

ToggleButton и CheckBox по сути один и тот же объект. на с сколько я помню, оба унаследованы от BaseButton.
Есть еще 1 способ как это сделать:
Берёте ListBox, в режиме одиночного выделения у ListBox может быть выделена либо 1 ListBoxItem, либо не 1 :)
то, что вам надо.

Далее вы либо переопределяете шаблон ListBoxItem'а, удаляете от туда всё говно типа выделения строки и оставляете только кнопки.
Меняете панель с вертикальной на горизонтальную или как вам там нужно, без виртуализации
Связывайте свойства IsSelected со свойством IsChecked, профит :)
У меня для таких целей есть контрол UniversalBox, в нём можно указать, какие элементы управления вы хотите получить в качестве контейнеров :)
...
Рейтинг: 0 / 0
Несколько ToggleButton
    #39531167
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так я сделал и почти работает как надо, но:
1) Как сделать, чтобы айтемы листбокса выглядели как кнопки?
2) И как отщелкнуть кнопку нажатием же на нее? Сейчас - только с зажатым Ctrl.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication5"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style x:Key="ToggleButtonListBox" 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>
            <Setter Property="ListBox.ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="BorderThickness" Value="0"/>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <ListBox Style="{StaticResource ToggleButtonListBox}">
            <ListBoxItem>Mode One</ListBoxItem>
            <ListBoxItem>Mode Two</ListBoxItem>
        </ListBox>
        <ToggleButton Grid.Row="1" Content="Toggle Button" Width="100"/>
    </Grid>
</Window>
...
Рейтинг: 0 / 0
Несколько ToggleButton
    #39531168
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        xmlns:linq="clr-namespace:System.Linq;assembly=System.Core"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ObjectDataProvider x:Key="Source" ObjectType="{x:Type linq:Enumerable}" MethodName="Range">
            <ObjectDataProvider.MethodParameters>
                <sys:Int32>1</sys:Int32>
                <sys:Int32>3</sys:Int32>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        <ToggleButton IsChecked="{Binding IsSelected, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
                                      Width="100" Height="100" Margin="5">
                            <ContentPresenter/>
                        </ToggleButton>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <ListBox ItemsSource="{Binding Source={StaticResource Source}}">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>
        </StackPanel>
    </Grid>
</Window>
...
Рейтинг: 0 / 0
Несколько ToggleButton
    #39531288
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здорово!!
А как прикрутить свойство VM или модели, чтобы можно было понять, какая кнопка нажата? Все тот же enum, например.

Тогда, если я правильно понимаю, можно повесить на все кнопки одну команду клик и в ней проверять текущую нажатую кнопку и
выполнять то или иное действие. Правда не понятно, что будет при отжатии кнопки..
...
Рейтинг: 0 / 0
Несколько ToggleButton
    #39531310
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1,

при отжатии будет выполняться та же команда, нужно передавать состояние кнопки в команду, чтоб понять, какое действие нужно выполнить. Но есть способ проще.
Так как вы используете List, предоставьте в качество списка набор Enum элементов заданного типа. Можно получить их либо через DataObjectProvider, либо через модель на ваше усмотрение.
Так как нажатая кнопка соответствует выделенному элементу в ListBox, значение выбранного Enum значения можно получить в SelectedItem ListBox'а и связать его со свойством ViewModel. Свойство должно быть Nullable, так как тип перечисления по сути своей структура.
Пример нужен или сами разберётесь? :)
...
Рейтинг: 0 / 0
Несколько ToggleButton
    #39531749
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо!!!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Несколько ToggleButton
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]