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