3

我正在关注本教程,了解如何在 WPF 应用程序中以动画的形式包含像素着色器效果

背景

我觉得事情进展顺利,但是我想对应用程序进行更改。在本教程中,作者有一个单独的 GrayscaleEffect 项目,并在他的 XAML 中执行以下操作:

xmlns:effect="clr-namespace:GrayscaleEffect;assembly=GrayscaleEffect"

后来他有这个:

DataTemplate x:Key="itemTemplate">
        <Grid Width="225" Margin="3">
            <Border BorderBrush="White" BorderThickness="2">
                <Image Source="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center">
                    <Image.Effect>
                        <local:GrayscaleEffectTest x:Name="grayscaleEffect"/>
                    </Image.Effect>
                    <Image.Triggers>
                        <EventTrigger RoutedEvent="Mouse.MouseEnter">
                            <BeginStoryboard>
                                <Storyboard>
<!--HERE-->                         <DoubleAnimation To="1.0" Duration="0:0:0.3" AccelerationRatio="0.10" DecelerationRatio="0.25" Storyboard.TargetName="grayscaleEffect" Storyboard.TargetProperty="(local:GrayscaleEffectTest.DesaturationFactor)" />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                        <EventTrigger RoutedEvent="Mouse.MouseLeave">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation To="0.0"  Duration="0:0:4" AccelerationRatio="0.10" DecelerationRatio="0.25" Storyboard.TargetName="grayscaleEffect" Storyboard.TargetProperty="(local:GrayscaleEffectTest.DesaturationFactor)" />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Image.Triggers>
                </Image>
            </Border>
        </Grid>
    </DataTemplate>

这里的关键点是很长的一行 <DoubleAnimation ....

Storyboard.TargetProperty="(effect:GrayscaleEffect.DesaturationFactor)" />

我的方法

我想做同样的事情,除了我想把我所有的代码都放在同一个项目中,而不是有两个项目。

所以,我不包括;assembly=GrayscaleEffect. 此外,我的<DoubleAnimation ...行内容如下:

<DoubleAnimation ... Storyboard.TargetName="grayscaleEffect" Storyboard.TargetProperty="(local:GrayscaleEffectTest.DesaturationFactor)" />

但是 WPF 设计器会引发初始化程序异常。程序运行,但当我将鼠标悬停时,没有任何动画被触发......

有人有想法么?我相信 WPF 应该能够在同一个项目中运行像素着色器......我的项目有预构建事件,除了重命名为 GrayscaleEffect Test并将两个项目合并为一个之外,我的项目应该是相同的到教程。我尝试了许多其他失败方法,主要是设置Storyboard.TargetProeprty = every damn thing under the sun. 还试图拼凑一些东西来在后面的代码中设置动画,希望我至少可以用一个调试器完成并尝试看看发生了什么。显然,没有任何效果:(。

任何帮助将不胜感激。干杯。

4

1 回答 1

4

有点尴尬,但错误是在椅子和键盘之间。所以,代码工作得很好。为了帮助其他人,我将解释我的调试过程,然后解释问题所在。

首先,我将像素着色器更改为从红色变为红色和绿色。那是:

 result.r = 255;
 result.g = 0;
 result.b = 255 * factor;

因子是发送到显卡的数据变量。一旦我这样做了,我注意到事情有点工作。过渡是阶跃函数,不是线性插值,而是颜色在变化。然后,我认为像素颜色范围必须是 [0 到 1.0]。这给了我应该得到的效果。

 result.r = 1.0;
 result.g = 0;
 result.b = 1.0 * factor;

最后,我加载了一张新的企鹅图片,而不是我使用的原始测试图像,我意识到我的主要错误。企鹅图片工作得很好,我想,这到底是什么?!然后我查看了我的测试图像,这是一张黑白图像!!!(哑巴哑巴哑巴)。不得不发布这个“解决方案”的耻辱有望阻止我再次犯这样的错误。感谢您的帮助@Nico Schertler。

于 2013-10-07T01:56:37.623 回答