C# ControlTemplate不透明度未按我希望的方式显示

C# ControlTemplate不透明度未按我希望的方式显示,c#,wpf,triggers,opacity,controltemplate,C#,Wpf,Triggers,Opacity,Controltemplate,我为我的DataGridCell <Style x:Key="MYDGCellStyle" TargetType="{x:Type DataGridCell}"> <Setter Property="OverridesDefaultStyle" Value="True" /> <Setter Property="Template" Value="{DynamicResource MYDGCellControlTemplate}" /&

我为我的
DataGridCell

<Style x:Key="MYDGCellStyle" TargetType="{x:Type DataGridCell}">
        <Setter Property="OverridesDefaultStyle" Value="True" />
        <Setter Property="Template" Value="{DynamicResource MYDGCellControlTemplate}" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsReadOnly}" Value="True">
                <Setter Property="Background">
                    <Setter.Value>
                        <SolidColorBrush Color="Gray" Opacity="0.3" />
                    </Setter.Value>
                </Setter>
            </DataTrigger>                
        </Style.Triggers>
    </Style>

    <ControlTemplate x:Key="MYDGCellControlTemplate" TargetType="{x:Type DataGridCell}">
        <Grid x:Name="CellGrid">
            <Border Background="{TemplateBinding Background}">
                <ContentPresenter VerticalAlignment="Center" Margin="4,0,6,0" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
            </Border>                
        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="IsFocused" Value="true">
                <Setter Property="Background" TargetName="CellGrid">
                    <Setter.Value>
                        <LinearGradientBrush Opacity="2" StartPoint="0,0.5" EndPoint="1,0.5">
                            <GradientStop Offset="0" Color="Fuchsia" />
                            <GradientStop Offset="0.2" Color="Transparent" />
                            <GradientStop Offset="0.8" Color="Transparent" />
                            <GradientStop Offset="1" Color="Fuchsia" />
                        </LinearGradientBrush>                            
                    </Setter.Value>
                </Setter>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
但是如果我聚焦其中一个
单元格
s,其中触发了我在代码中添加的
数据触发器
,则颜色显示不正确

如何在金色背景前显示紫红色边

灰色细胞聚焦:

金电池聚焦:

更新

<ControlTemplate x:Key="MYDGCellControlTemplate" TargetType="{x:Type DataGridCell}">            
            <Grid>
            <Grid Grid.ZIndex="99"  x:Name="CellGrid"/>
            <Border Grid.ZIndex="98" Background="{TemplateBinding Background}">
                    <ContentPresenter VerticalAlignment="Center" Margin="4,0,6,0" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                </Border>
            </Grid>            
        <ControlTemplate.Triggers>
            <Trigger Property="IsFocused" Value="true">
                <Setter Property="Background" TargetName="CellGrid">
                    <Setter.Value>
                        <LinearGradientBrush Opacity="2" StartPoint="0,0.5" EndPoint="1,0.5">
                            <GradientStop Offset="0" Color="Fuchsia" />
                            <GradientStop Offset="0.1" Color="#00FF00FF" />
                            <GradientStop Offset="0.9" Color="#00FF00FF" />
                            <GradientStop Offset="1" Color="Fuchsia" />
                        </LinearGradientBrush>                            
                    </Setter.Value>
                </Setter>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

您的问题可能是,在紫红色边缘上方使用金色笔刷,使其着色50%

s.Value = new SolidColorBrush(Colors.Gold) { Opacity = 0.5 };
此外,您应该注意,在XAML中使用
Transparent
意味着“白色,无不透明”,因此,如果要淡出funchsia,则不应淡出为透明白色,而应淡出为透明紫红色

White:               #FFFFFFFF
Transparent:         #00FFFFFF
Fuchsia opaque:      #FFFF00FF
Fuchsia transparent: #00FF00FF
为了强制执行z顺序,您可以在给定的项目周围使用一个额外的容器,并在此处应用状态“在运行时”。无论如何,这不是一种MVVM方法

更好的方法可能是在XAML中定义自定义模板参数(
bool IsSpecificColumn
),该参数将在代码“运行时”中设置。使用
multi-trigger
还可以定义金+紫红色的第三种状态

如果您必须组合更多的状态,您应该让WPF来完成这项工作,并将上述装箱容器与模板参数一起使用。

尝试在您的新样式(I ProductionStatus)中创建一个新的“IsFocused”触发器,如下所示:

<Trigger Property="IsFocused" Value="true">
    <Setter Property="Background" TargetName="CellGrid">
        <Setter.Value>
            <LinearGradientBrush Opacity="2" StartPoint="0,0.5" EndPoint="1,0.5">
                <GradientStop Offset="0" Color="Fuchsia" />
                <GradientStop Offset="0.2" Color="Gold" />
                <GradientStop Offset="0.8" Color="Gold" />
                <GradientStop Offset="1" Color="Fuchsia" />
             </LinearGradientBrush>                            
         </Setter.Value>
    </Setter>
</Trigger>


我知道你是在代码背后做这件事,但我想你会理解我的(更容易复制粘贴)。

所以问题是,如果你聚焦一个金色单元格,紫红色的边显示为橙色,我错了吗?不,你是对的。我想这是因为如果我的黄金上的透明度为1,那么就根本看不到紫红色的一面。如果我将不透明度设置为0.1,紫红色的边将正确显示,但是金色不再是真正的金色。那么,图像中哪个单元格的颜色显示正确?第一组或第二组中的E或l行?单元格的颜色都正确。但第二张图片中的紫红色边是错误的。它们看起来应该和第一个一样。是的,我也认为这是我的问题。但是我如何在紫红色边缘下使用金色笔刷呢?我需要在App.xaml中使用我的标准样式,但也需要在运行时添加新的触发器。因为我在边界周围有一个网格。边框是模板组合,而品红位于边框上方的网格上。
<Trigger Property="IsFocused" Value="true">
    <Setter Property="Background" TargetName="CellGrid">
        <Setter.Value>
            <LinearGradientBrush Opacity="2" StartPoint="0,0.5" EndPoint="1,0.5">
                <GradientStop Offset="0" Color="Fuchsia" />
                <GradientStop Offset="0.2" Color="Gold" />
                <GradientStop Offset="0.8" Color="Gold" />
                <GradientStop Offset="1" Color="Fuchsia" />
             </LinearGradientBrush>                            
         </Setter.Value>
    </Setter>
</Trigger>