ControlTemplate Opacity不会像我想要的那样显示

时间:2015-11-04 08:52:23

标签: c# wpf triggers opacity controltemplate

我为Style

定义了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>

在运行期间,我在代码

中为此类Triggers添加了额外的Columns
Style Sty = null;
if (Sty == null)
{
    Sty = new Style(typeof(DataGridCell));                                
    Sty.BasedOn = (Style)Application.Current.TryFindResource("MYDGCellStyle");                                
}

DataTrigger t = new DataTrigger();
t.Binding = new Binding("ProductionStatus");
t.Value = "I";
Setter s = new Setter();
s.Property = DataGridCell.BackgroundProperty;
s.Value = new SolidColorBrush(Colors.Gold) { Opacity = 0.5 };
t.Setters.Add(s);

Sty.Triggers.Add(t);
DGC.CellStyle = Sty;

但是,如果我将Cell中的一个重点放在我在代码中添加的DataTrigger被触发的位置,则颜色未正确显示。

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

灰色细胞聚焦:

Grey Cell Focused

黄金细胞聚焦:

Gold Cell Focused

更新

<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>

2 个答案:

答案 0 :(得分:0)

你的问题可能是,你在紫红色的边缘上面涂上了一个金色的刷子 ,所以它们被50%的金色着色。

s.Value = new SolidColorBrush(Colors.Gold) { Opacity = 0.5 };

另外你应该知道在XAML中使用Transparent意味着“白色没有不透明度”,所以如果你想淡出黑色,你不应该淡化为透明的白色,而应该淡化为透明的紫红色。

White:               #FFFFFFFF
Transparent:         #00FFFFFF
Fuchsia opaque:      #FFFF00FF
Fuchsia transparent: #00FF00FF

要强制执行z顺序,您可以在给定项目周围使用其他容器,并在“运行时”中应用此处的状态。无论如何,这不是MVVM方法。

更好的方法是在XAML中定义自定义模板参数(bool IsSpecificColumn),这将在代码中“在运行时”中设置。使用MultiTrigger你也可以为gold + fuchsia定义第三个状态。

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

答案 1 :(得分:0)

尝试在您的新风格(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>

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