在 WPF 中禁用复选框检查

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11021836/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 23:26:27  来源:igfitidea点击:

Disabling checkbox checking in WPF

wpfcheckboxcheckboxpreference

提问by patryk.beza

I want to make impossible checking checkboxin WPF (from C# code). Only unchecking would be allowed.
How can I do it?

我想在 WPF(来自 C# 代码)中进行不可能的检查复选框。只允许取消选中。
我该怎么做?

PS.
Writing event handler on Click eventwhich would immediately uncheck checkbox after checking it is not acceptable.

附注
Click 事件上编写事件处理程序,在检查后立即取消选中复选框是不可接受的。

[edit]
Checkbox should always be enabled, so that user can think that checkbox can be checked. It's strange but it's specific programme.

[编辑]
复选框应始终启用,以便用户可以认为可以选中复选框。这很奇怪,但它是特定的程序。

回答by Nick Babcock

<CheckBox Content="Checkbox"
          IsEnabled="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}" />


Edit after being informed that the checkbox always has to look to be in an checkable state, even when it's not. Here is a working example:

在被告知复选框始终必须看起来处于可检查状态后进行编辑,即使它不是。这是一个工作示例:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" x:Class="WpfTest.MainWindow"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ControlTemplate x:Key="DeceptiveCheckbox" TargetType="{x:Type CheckBox}">
            <BulletDecorator Background="Transparent" SnapsToDevicePixels="True">
                <BulletDecorator.Bullet>
                    <Microsoft_Windows_Themes:BulletChrome BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" IsChecked="{TemplateBinding IsChecked}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}"/>
                </BulletDecorator.Bullet>
                <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
            </BulletDecorator>
            <ControlTemplate.Triggers>
                <Trigger Property="HasContent" Value="True">
                    <Setter Property="FocusVisualStyle">
                        <Setter.Value>
                            <Style>
                                <Setter Property="Control.Template">
                                    <Setter.Value>
                                        <ControlTemplate>
                                            <Rectangle Margin="14,0,0,0" SnapsToDevicePixels="True" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Padding" Value="4,0,0,0"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Window.Resources>
    <Grid>
        <CheckBox Content="CheckBox"  IsEnabled="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Template="{StaticResource DeceptiveCheckbox}" />
    </Grid>
</Window>

The fix was simple. I simply created a copy of the current checkbox template and removed:

修复很简单。我只是创建了当前复选框模板的副本并删除了:

<Trigger Property="IsEnabled" Value="False">
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>

回答by CodingGorilla

How about this:

这个怎么样:

<Grid>
    <Grid.Resources>
        <Style TargetType="CheckBox">
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="False">
                    <Setter Property="IsEnabled" Value="False" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Grid.Resources>

    <CheckBox IsChecked="True" />
</Grid>

This approach has the benefit of being applied to all (as-is) or many (if you apply a x:Keyattribute and then assign the resource to the desired checkboxes) without needing to do anything special or change the bindings of the individual checkboxes.

这种方法的好处是可以应用于所有(原样)或许多(如果您应用一个x:Key属性,然后将资源分配给所需的复选框),而无需执行任何特殊操作或更改单个复选框的绑定。

回答by Kevin DiTraglia

An easy solution could be to bind the IsEnabled property to be equal to the IsChecked property.

一个简单的解决方案可能是将 IsEnabled 属性绑定为等于 IsChecked 属性。