【发布时间】:2016-02-26 15:48:01
【问题描述】:
有没有一种简单的方法可以让 ToggleButton 显示为普通按钮?我正在尝试单击该按钮,它将触发 IsEnabled 对另一个控件为 false。使用 ToggleButton,我可以触发 IsChecked 属性。然而,ToggleButton 在切换时看起来完全不同。谢谢。
【问题讨论】:
有没有一种简单的方法可以让 ToggleButton 显示为普通按钮?我正在尝试单击该按钮,它将触发 IsEnabled 对另一个控件为 false。使用 ToggleButton,我可以触发 IsChecked 属性。然而,ToggleButton 在切换时看起来完全不同。谢谢。
【问题讨论】:
在 WPF 设计器中,右键单击相关的 ToggleButton 并选择 Edit Template -> Edit a Copy。选择适当的设置并单击“确定”。
ToggleButton 的默认模板将添加到您的 XAML。在那里,删除这段代码:
<Trigger Property="IsChecked" Value="true">
<Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
</Trigger>
您可以将此样式/模板重复用于多个切换按钮。
编辑
您还有其他选择。使用标准的Button 并连接Click 事件处理程序或执行代码以更新IsChecked 属性的Command 绑定,例如
<CheckBox IsChecked="{Binding IsChecked}" IsEnabled="False" Content="State" />
<Button Content="Toggle" Command="{Binding ToggleStateCommand}" />
那么,当然,你的命令只需要执行
IsChecked = !IsChecked
这一切都假设您有一个您熟悉的 ICommand 实现,并且您正在做一些 MVVM,但这可能有点超出本 Q/A 的范围。
【讨论】:
ButtonChrome 对象,该对象具有来自当前应用的 Windows 主题的适当样式。这是我所提倡的唯一一种“重复”。也就是说,您对限制滥用行为的热情是值得拥有的。
最简单的方法是使ToggleButton 透明,并在其内容中显示一些其他控件。为内容设置IsHitTestVisible = False。
也用 Margin 值做实验。
<ToggleButton Background="Transparent" BorderBrush="Transparent" BorderThickness="0" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
<Button Content="Toggle Button" Margin="-5" IsHitTestVisible="True" />
</ToggleButton>
上面可以自定义使用 ToggleButton 的内容,例如:
<ToggleButton Content="Toggle Button" Background="Transparent" BorderBrush="Transparent" BorderThickness="0" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Canvas.Left="233" Canvas.Top="158">
<ToggleButton.ContentTemplate>
<DataTemplate>
<Button IsHitTestVisible="False" Content="{Binding}"/>
</DataTemplate>
</ToggleButton.ContentTemplate>
</ToggleButton>
【讨论】: