gpt4 book ai didi

WPF 如何为阴影设置所需的颜色?

转载 作者:行者123 更新时间:2023-12-04 21:15:46 25 4
gpt4 key购买 nike

这是绘制椭圆的示例代码,启用了阴影。我将填充颜色和阴影颜色设置为相同。但在 View 阴影颜色是不同的。这可能是 WPF 功能,但在我的场景中,我想为对象设置所需的阴影颜色。

<Window x:Class="Test.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">

<Grid>
<Canvas>
<Ellipse Width="200" Height="300" Fill="#7D00FE">
<Ellipse.Effect>
<DropShadowEffect
ShadowDepth="5"
Color="#7D00FE"/>
</Ellipse.Effect>
</Ellipse>
</Canvas>
</Grid>
</Window>

最佳答案

似乎 DropShadowEffect 在渲染自身时会以某种方式影响 Color。这个问题对于原色似乎不存在(所谓的颜色,如红色、蓝色、水绿色等 - 但您不必使用名称,您也可以通过 #AARRGGBB 格式指定它们。)

我无法弄清楚它所做的确切修改,也无法提供解决方法(除了使用命名颜色...),但我认为在答案中可能值得注意。

请参阅其他问题,这些问题可能指向 DropShadowEffect 的相同“错误”或未记录的功能:

更新:所以,这是作弊,但对于您的具体问题,它可能会解决问题:

<Grid>
<Canvas>
<Ellipse Width="200" Height="300" Fill="#7D00FE">
<Ellipse.Effect>
<DropShadowEffect
ShadowDepth="5"
Color="#BA00FE"/>
</Ellipse.Effect>
</Ellipse>
</Canvas>
</Grid>

通过一些投入的工作,人们可能能够想出一个转换器,它可以将一种颜色转换为另一种颜色,这将是给定颜色所需的 DropShadowEffect 颜色。如果我有一点时间,我会回到这个问题上。

我的直觉表明问题可能出在该特定效果的着色器代码中,并且输出可能因不同的硬件(和/或驱动程序版本)而异,但目前我无法证明这一点。

更新:

我对命名颜色的理解是错误的,它不适用于所有这些颜色,例如:绿色是有缺陷的,但问题不仅仅在于颜色的绿色成分。有趣。

更新 2:

所以这是我之前谈到的转换器:

using System;
using System.Windows.Data;
using System.Windows.Media;

namespace MyCustomConverters
{
public class ColorToShadowColorConverter: IValueConverter
{

#region IValueConverter Members

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// Only touch the shadow color if it's a solid color, do not mess up other fancy effects
if (value is SolidColorBrush)
{
Color color = ((SolidColorBrush)value).Color;
var r = Transform(color.R);
var g = Transform(color.G);
var b = Transform(color.B);

// return with Color and not SolidColorBrush, otherwise it will not work
// This means that most likely the Color -> SolidBrushColor conversion does the RBG -> sRBG conversion somewhere...
return Color.FromArgb(color.A, r, g, b);
}

return value;
}

private byte Transform(byte source)
{
// see http://en.wikipedia.org/wiki/SRGB
return (byte)(Math.Pow(source / 255d, 1 / 2.2d) * 255);
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException("ColorToShadowColorConverter is a OneWay converter.");
}

#endregion
}
}

下面是它应该如何使用:

资源部分:

<namespaceDefinedByXmlnsProperty:ColorToShadowColorConverter x:Key="ColorConverter" />

实际用法:

<Ellipse Width="50" Height="100" Fill="#7D00FE">
<Ellipse.Effect>
<DropShadowEffect ShadowDepth="50"
Color="{Binding Fill, RelativeSource={RelativeSource
Mode=FindAncestor, AncestorType={x:Type Ellipse}},
Converter={StaticResource ColorConverter}}"/>
</Ellipse.Effect>
</Ellipse>

感谢 Michal Ciechan 的回答,因为它指引了我正确的方向。

关于WPF 如何为阴影设置所需的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22835131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com