[wpf] WPF에서 라디오 버튼처럼 작동하도록 토글 버튼 그룹을 얻는 방법은 무엇입니까?

토글 버튼처럼 작동해야하는 버튼 그룹이 있지만 현재 시간에 하나의 버튼 만 선택 / 누를 수있는 라디오 버튼 역할도합니다. 또한 아무 버튼도 선택 / 누르지 않은 상태 여야합니다.

이 동작은 Photoshop 도구 모음과 유사하며 언제든지 도구 중 하나 또는 하나가 선택됩니다!

이것이 WPF에서 어떻게 구현 될 수 있는지 아십니까?



답변

가장 쉬운 방법은 ListBox의 스타일을 지정하여 ItemTemplate에 ToggleButtons를 사용하는 것입니다.

<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>

그런 다음 ListBox의 SelectionMode 속성을 사용하여 SingleSelect 대 MultiSelect를 처리 할 수 ​​있습니다.


답변

제 생각에는 이것이 가장 쉬운 방법입니다.

<RadioButton Style="{StaticResource {x:Type ToggleButton}}" />

즐겨! -가시 톱


답변

<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>

그것은 나를 위해 작동합니다, 즐기십시오!


답변

VisualTreeHelper의 도움으로 groupcontrol (Grid, WrapPanel, …)의 모든 ToggleButton.IsChecked를 false로 설정하는 ToggleButton 클릭시 항상 일반 이벤트를 사용할 수 있습니다. 그런 다음 보낸 사람을 다시 확인하십시오. 또는 그와 비슷한 것.

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;
    }


답변

라디오 버튼이있는 그리드를 넣고 raduiobuttons 용 템플릿과 같은 버튼을 만들 수 있습니다. 버튼을 토글하지 않으려면 프로그래밍 방식으로 확인을 제거하는 것보다


답변

시도해 볼 수도 있습니다. 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;
 }


답변

RibbonToggleButtons에 대해이 작업을 수행했지만 일반 ToggleButtons에도 동일 할 수 있습니다.

여기에서 EnumToBooleanConverter를 사용하여 각 단추에 대한 IsChecked를 “모드”열거 형 값 에 바인딩했습니다. RadioButtons를 열거 형에 바인딩하는 방법은 무엇입니까? (ConverterParameter를 사용하여이 단추에 대한 열거 형 값을 지정합니다. 각 단추에 대해 하나의 열거 형 값이 있어야합니다.)

그런 다음 이미 확인 된 버튼의 선택을 취소하지 않도록 각 RibbonToggleButtons의 Click 이벤트에 대한 코드 뒤에 다음을 입력합니다.

    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's fine, ignore it
            bool notChecked = ( ! (bool)button.IsChecked );
            if( notChecked ){ // I guess this means the click would uncheck it
                button.IsChecked = true;
            }
        }
    }