样式禁用数据网格中的组件

时间:2013-07-14 12:33:02

标签: c# .net wpf xaml styles

我想摆脱数据网格单元格(Checkboxes,Timepicker,comboboxes等)的灰色淡出行为,当它们被设置为禁用时。

enter image description here

所以这就是我要做的事情:

<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(Checkbox,comboboxes等)中的控件单独定义样式?什么是使这项工作的好方法?

1 个答案:

答案 0 :(得分:1)

首先,事实是属性IsEnabled 在某些控件中进行了硬编码,因此设置Background等属性是不可能的,因为控件中的颜色是硬编码的。例如 - BackgroundComboBoxTextBox等。因此,在这种情况下,创建样式和模板, 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获取。

CheckBoxlink)的示例样式:

<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);
    }        
}

P.S。不要担心{x:Reference}警告消息,它可以是ignored