【问题标题】:ControlTemplate Opacity not displayed like I want it toControlTemplate 不透明度没有像我想要的那样显示
【发布时间】:2016-02-04 16:25:33
【问题描述】:

我为我的DataGridCell 定义了一个Style

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

在运行时,我在我的代码中为特定的Columns 添加额外的Triggers,就像这样

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;

但是,如果我关注Cells 之一,我在代码中添加的DataTrigger 被触发,颜色将无法正确显示。

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

专注于灰细胞:

专注于黄金细胞:

更新

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

【问题讨论】:

  • 所以问题是如果你聚焦一个金色单元格,紫红色边显示为橙色,我错了吗?
  • 不,你是对的。我认为这是因为如果我的 Gold 的不透明度为 1,则根本看不到紫红色的一面。如果我将不透明度设置为 0.1,紫红色边会正确显示,但黄金不再是真正的黄金了。
  • 那么,图像中哪个单元格的颜色显示正确?第一组还是第二组E排还是L排?
  • 单元格的颜色都是正确的。但是第二张图片中的紫红色边是错误的。它们应该看起来和第一个一样。

标签: c# wpf triggers opacity controltemplate


【解决方案1】:

尝试以您的新样式(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>

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

【讨论】:

    【解决方案2】:

    您的问题可能是,您在紫红色边缘上方应用了金色刷子,因此它们被 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 完成这项工作,并使用上面提到的盒装容器和模板参数的方法。

    【讨论】:

    • 是的,我也认为这是我的问题。但是我怎样才能在紫红色边缘应用金色画笔呢?我需要在我的 App.xaml 中使用标准样式,还需要在运行时添加新触发器。
    • 我坚持我已经用容器做了方法。因为我在边界周围有一个网格。 Border 是 TemplateBining,而紫红色在 Border 上方的 Grid 上。
    猜你喜欢
    • 2021-10-06
    • 2020-12-24
    • 2011-02-25
    • 2019-07-08
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多