WinUI 3中PointSpecularEffect创建工厂报错的解决咨询
解决WinUI 3中PointSpecularEffect创建工厂时的参数错误问题
问题核心原因
PointSpecularEffect属于光照类合成效果,必须显式设置LightPosition属性,这是该效果的必填参数。你当前的代码遗漏了这个参数,导致创建CompositionEffectFactory时触发ArgumentException。而高斯模糊、饱和度这类效果没有强制要求的位置类参数,所以可以正常工作。
修正后的完整代码
XAML部分
<Grid Name="_MainGrid"> <Rectangle Name="_Test" Width="500" Height="500" Fill="Green"/> </Grid>
C#代码部分
Visual visualTest = ElementCompositionPreview.GetElementVisual(_Test); Compositor compositorTest = visualTest.Compositor; ContainerVisual containerVisualTest = (ContainerVisual)ElementCompositionPreview.GetElementVisual(_Test); PointSpecularEffect light = new PointSpecularEffect() { Name = "Light", Source = new CompositionEffectSourceParameter("source"), LightColor = Colors.Red, SpecularAmount = 2, SpecularExponent = 2, // 必须添加光源位置参数,示例设置在元素中心上方 LightPosition = new Vector3(250, 250, 100) }; CompositionEffectFactory lightFactory = compositorTest.CreateEffectFactory(light); CompositionEffectBrush lightBrush = lightFactory.CreateBrush(); // 为效果笔刷绑定源,获取目标元素的视觉内容作为光照输入 lightBrush.SetSourceParameter("source", compositorTest.CreateBackdropBrush()); SpriteVisual lightVisual = compositorTest.CreateSpriteVisual(); lightVisual.Size = new Vector2(500, 500); lightVisual.Brush = lightBrush; containerVisualTest.Children.InsertAtTop(lightVisual);
关键补充说明
LightPosition的Vector3参数中,前两个值对应目标元素的2D坐标(x,y),第三个值是光源的Z轴深度(值越大,光照范围越广,强度越柔和)- 必须通过
SetSourceParameter为效果笔刷绑定输入源,这里使用CreateBackdropBrush()获取目标元素的视觉内容作为光照效果的基础 - 所有光照类合成效果(包括
PointSpotLightEffect、DirectionalLightEffect等)都有类似的必填参数要求,使用前需确认所有强制属性已配置
内容的提问来源于stack exchange,提问作者Георгий Попов
相关产品推荐
相关产品推荐

