如何 'Disable' WPF 用户控件?

How to 'Disable' a WPF UserControl?

我有一个 UserControl,当 'IsEnabled' 为 false 时我需要更改它的外观。我知道这是非常基本的 WPF 样式,但我似乎无法将各个部分组合在一起。我假设我需要创建一个样式,并为“属性="IsEnabled" Value="False" 添加一个触发器。但是我应该把样式定义放在哪里?(?)我如何应用它?...在​​ UserControl 或 Parent window 中?我的触发器是否需要在 Setter 元素内?样式是否需要应用于UserControl 还是它的 children?我不知道还有什么问题需要问!

如果您觉得这与另一个问题重复,请告诉我。 如果您知道有关 WPF 样式的简单好教程可以回答我的问题,我将不胜感激。

我的代码如下所示:

<UserControl x:Class="UserControls.UCDemo"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:UserControls"
         mc:Ignorable="d" 
         d:DesignHeight="240" d:DesignWidth="200">
<UserControl.Resources>

</UserControl.Resources>

<Grid Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="5*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid Grid.Row="0" Background="{Binding BG}" >
        <Ellipse Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5" Fill="DeepSkyBlue" />
    </Grid>
    <Grid Grid.Row="1" Background="Tomato" />
</Grid>
        <uc:UCDemo x:Name="Demo" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="300,100,0,0" Width="80" Height="100" Style="{StaticResource uc:DemoStyle}"
                        Visibility="{Binding LightVisible, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Converter={StaticResource BooleanToVisibilityConverter}}" />

感谢您的帮助!

这取决于当 IsEnabled 为 false 时外观应该如何变化。

带有 Trigger 的简单样式可以直接分配给 UserControl 的 Style 属性。下面的只是将 Opacity 设置为 0.5.

<UserControl ...>
    <UserControl.Style>
        <Style TargetType="UserControl">
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Opacity" Value="0.5"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </UserControl.Style>

    <Grid Background="Transparent">
        ...
    </Grid>
</UserControl>

我不确定我明白你的问题是什么。但是为了改变一个控件的 IsEnabled 属性 ,依赖于其他控件是: 假设必须更改其 IsEnabled 的控件是 A,而 A 所依赖的控件是 B。 首先,为 B 选择一个名称:x:Name = "AccessCheckBox"。 然后为控件 B 编写这样的绑定:

< ... IsEnabled = {Binding ElementName = "AccessCheckBox", Path="IsChecked".../>

完成。我希望我明白你的意思。