3

当数据网格单元格(复选框、时间选择器、组合框等)被设置为禁用时,我想摆脱它们的灰色淡出行为。

在此处输入图像描述

所以这就是我想要做的:

<Style TargetType="DataGridCell">
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="{x:Null}" />
            <Setter Property="Background" Value="{x:Null}" />
            <Setter Property="BorderBrush" Value="{x:Null}" />
        </Trigger>
    </Style.Triggers>
</Style>

但它不起作用。

我是否需要为实际位于 datagridcell 内的控件(复选框、组合框等)单独定义样式?什么是使这项工作的好方法?

4

1 回答 1

1

首先,事实是某些控件中的属性是IsEnabled 硬编码的,所以设置属性等是Background不可能的,因为控件中的颜色是硬编码的。例如 - Backgroundin: ComboBox,TextBox等。因此,在这种情况下,创建样式和模板,overriding控件的默认行为(在我们的例子中:IsEnabled=False行为)。

其次,分配属性中的什么控件是DataTemplate IsEnabled这样的:

<DataGridTemplateColumn x:Name="ComboBoxColumn" Header="ComboBox Header" Width="110">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox IsEnabled="False" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

并不是说这DataGridCell将是False,因此,触发器不会触发:

<Style.Triggers>
    <Trigger Property="IsEnabled" Value="False">
        <Setter Property="Foreground" Value="Black" />
    </Trigger>
</Style.Triggers>

因此得出结论:

确定控件启用时的行为false。每个控件的样式都可以从MSDN.

CheckBox链接)的示例样式:

<Style x:Key="{x:Type CheckBox}" TargetType="CheckBox">
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="FocusVisualStyle" Value="{StaticResource CheckBoxFocusVisual}"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="CheckBox">
                <BulletDecorator Background="Transparent">
                    <BulletDecorator.Bullet>
                        <Border x:Name="Border" Width="13" Height="13" CornerRadius="0" Background="{StaticResource NormalBrush}" BorderThickness="1" BorderBrush="{StaticResource NormalBorderBrush}">
                            <Path Width="7" Height="7" x:Name="CheckMark" SnapsToDevicePixels="False" Stroke="{StaticResource GlyphBrush}" StrokeThickness="2" Data="M 0 0 L 7 7 M 0 7 L 7 0" />
                        </Border>
                    </BulletDecorator.Bullet>

                    <ContentPresenter Margin="4,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Left" RecognizesAccessKey="True" />
                </BulletDecorator>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="false">
                        <Setter TargetName="CheckMark" Property="Visibility" Value="Collapsed"/>
                    </Trigger>

                    <Trigger Property="IsChecked" Value="{x:Null}">
                        <Setter TargetName="CheckMark" Property="Data" Value="M 0 7 L 7 0" />
                    </Trigger>

                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter TargetName="Border" Property="Background" Value="{StaticResource DarkBrush}" />
                    </Trigger>

                    <Trigger Property="IsPressed" Value="true">
                        <Setter TargetName="Border" Property="Background" Value="{StaticResource PressedBrush}" />
                        <Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource PressedBorderBrush}" />
                    </Trigger>                           

                    <!-- Here set the some properties there IsEnabled will be false -->
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="Border" Property="Background" Value="Red" />
                        <Setter TargetName="Border" Property="BorderBrush" Value="Green" />
                        <Setter Property="Foreground" Value="Orange"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>               

我已经DependencyProperty为显示它是否已关闭的列定义了附件。此后,模板列中的每个控件的引用方式如下:

<DataGridTemplateColumn x:Name="CheckBoxColumn" local:MyDependencyClass.IsEnabledColumn="False" Width="110" Header="CheckBox Header">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox Content="My CheckBox" IsEnabled="{Binding Source={x:Reference Name=CheckBoxColumn}, Path=(local:MyDependencyClass.IsEnabledColumn)}" IsChecked="False" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

设置属性IsEnabledColumn,你可以为那些你想禁用的控件设置(IsEnabled=False)。

清单MyDependencyClass

public class MyDependencyClass : DependencyObject
{
    public static readonly DependencyProperty IsEnabledColumnProperty;

    public static void SetIsEnabledColumn(DependencyObject DepObject, bool value)
    {
        DepObject.SetValue(IsEnabledColumnProperty, value);
    }

    public static bool GetIsEnabledColumn(DependencyObject DepObject)
    {
        return (bool)DepObject.GetValue(IsEnabledColumnProperty);
    }

    static MyDependencyClass()
    {
        PropertyMetadata MyPropertyMetadata = new PropertyMetadata(false);

        IsEnabledColumnProperty = DependencyProperty.RegisterAttached("IsEnabledColumn",
                                                            typeof(bool),
                                                            typeof(MyDependencyClass),
                                                            MyPropertyMetadata);
    }        
}

PS不要担心{x:Reference}警告信息,它可以忽略

于 2013-07-14T17:09:55.170 回答