gpt4 book ai didi

c# - 将 WPF 单选按钮样式设置为具有正确 IsEnabled 行为的切换按钮

转载 作者:太空宇宙 更新时间:2023-11-03 18:57:16 24 4
gpt4 key购买 nike

我需要将一些分组单选按钮设置为切换按钮。为此,我将以下样式应用于单选按钮:

Style="{StaticResource {x:Type ToggleButton}}"

这给了我想要的风格,但我注意到了一个恼人的副作用。我需要能够在禁用控件时更改所选按钮。这与普通单选按钮的预期一样有效。但是,对于切换按钮样式的按钮,它不再显示其中一个按钮被选中。

在下面的演示中,如果您反复单击“启用切换”按钮,您会看到所选按钮在重新启用时仍然突出显示。但是,如果您在禁用时更改所选按钮然后重新启用(单击“启用切换”、“更改值”、“启用切换”),则两个按钮都不会突出显示。

我要实现的目标:

  1. 尽可能接近 ToggleButton 的样式。
  2. 当一个选中的按钮被禁用时,保持蓝色背景但不透明。
  3. 无论值是否已更改,重新启用按钮时都具有标准的 ToggleButton 样式。

XAML:

<Window x:Class="ToggleButtonDemo.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:ToggleButtonDemo"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="200"
Name="demoWindow"
DataContext="{Binding ElementName=demoWindow}">
<StackPanel>
<GroupBox Header="Radio" IsEnabled="{Binding Enable}">
<StackPanel Orientation="Horizontal">
<RadioButton Name="radio1" Content="One" GroupName="RadioGroup" IsChecked="True"/>
<RadioButton Name="radio2" Content="Two" GroupName="RadioGroup"/>
</StackPanel>
</GroupBox>
<GroupBox Header="Toggle" IsEnabled="{Binding Enable}">
<StackPanel Orientation="Horizontal">
<RadioButton Name="toggle1" Content="One" GroupName="ToggleGroup" Style="{StaticResource {x:Type ToggleButton}}" IsChecked="True"/>
<RadioButton Name="toggle2" Content="Two" GroupName="ToggleGroup" Style="{StaticResource {x:Type ToggleButton}}"/>
</StackPanel>
</GroupBox>
<Button Name="toggle" Content="Toggle enabled" Click="toggle_Click"/>
<Button Name="changeValue" Content="Change value" Click="changeValue_Click"/>
</StackPanel>
</Window>

代码隐藏:

using System.ComponentModel;
using System.Windows;

namespace ToggleButtonDemo
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{

private bool mEnable = true;

public bool Enable
{
get
{
return mEnable;
}
set
{
mEnable = value;
OnPropertyChanged(nameof(Enable));
}
}

public MainWindow()
{
InitializeComponent();
}

public event PropertyChangedEventHandler PropertyChanged;

public virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

private void toggle_Click(object sender, RoutedEventArgs e)
{
Enable = !Enable;
}

private void changeValue_Click(object sender, RoutedEventArgs e)
{
if (radio1.IsChecked == true)
{
radio2.IsChecked = true;
}
else if (radio2.IsChecked == true)
{
radio1.IsChecked = true;
}

if (toggle1.IsChecked == true)
{
toggle2.IsChecked = true;
}
else if (toggle2.IsChecked == true)
{
toggle1.IsChecked = true;
}
}
}
}

最佳答案

我从下面引用的链接中得到了这个答案...我以前从未见过这样做,但与从 Blend 中获取完整样式定义相比,它使用更少的 XAML 效果很好(除非您需要自定义样式):

https://social.msdn.microsoft.com/Forums/vstudio/en-US/e0ce86f0-8fa3-4aa9-9617-4157326ee077/make-radiobutton-appear-as-togglebutton?forum=wpf

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

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

您还可以为 RadioButton 定义样式并将其基于 ToggleButton,这样您就不必为每个 RadioButton 指定样式。

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

关于c# - 将 WPF 单选按钮样式设置为具有正确 IsEnabled 行为的切换按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42089140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com