在本教程中,我一直在关注如何在WPF应用程序中以动画形式包含Pixel Shader Effects。
我感觉事情进展顺利,但是我想对应用程序进行更改。在本教程中,作者有一个单独的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
。还试图破解一些东西以在后面的代码中设置动画,以希望我至少可以通过调试器来逐步了解发生了什么。显然,没有任何效果:(。
任何帮助将不胜感激。干杯。
有点尴尬,但错误出在椅子和键盘之间。因此,代码工作得很好。为了帮助他人,我将解释我的调试过程,然后解释问题所在。
首先,我将像素着色器更改为从红色变为红色和绿色。那是:
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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句