前面老周已介绍过灯光的使用,如果你忘了,请用九牛二虎之力猛点击 这里 去温习一下。本篇老周再介绍另一种添加灯光的要领,这种要领是专为 XAML 元素而设计的,可以很便利地为可视化元素添加灯光效果。
不知道大伙伴是否发明,UIElement 类果然了一个 Lights 属性(15063,v1703,或更高版本),它是一个列表,可以添加若干个 XamlLight 东西。通过这个属性,我们也能为 XAML 可视化元素设置灯光。
虽然我们看到 XamlLight 类有结构函数,但是,它不是直接使用的,因为它一些重要成员都声明为 protected,这在外部类是无法访谒的。所以,你必需本身派生出一个自界说的类型,然后为这些成员设置相关的内容。为什么这样做呢?你想想啊,如果只实例化这个类,运行时根柢不成能知道你要用啥灯光,故你得本身去动手写。
先看看这些重要成员是啥。
protected virtual void OnConnected(UIElement newElement); protected virtual void OnDisconnected(UIElement oldElement); protected virtual string GetId(); // 这个属性用来设置要用的灯光东西 protected CompositionLight CompositionLight { get; set; }
先介绍一下长得最帅的阿谁—— CompositionLight,我们在代码中按照本身的需要,使用 Compositor 来创建灯光实例,还记得前面学过的内容吧,然后把灯光实例赋值给 CompositionLight 属性。
那么,在啥时候赋值呢?我们看到,有两个对应的要领—— OnConnected 和 OnDisconnected。当咱们把自界说的类型实例添加到 UIElement 元素的 Lights 列表中时,就会挪用 OnConnected 要领,而跟从要领参数通报的就是这个可视化元素的实例。好比,你把这个自界说类实例添加到 Grid 的 Lights 列表中,那么传给 newElement 参数的就是这个 Grid。相反地,当我们自界说的XamlLight东西从 Lights 列表中被移除时,会挪用 OnDisconnected 要领,这时候我们就应该把 CompositionLight 属性所占用的资源清理失,如挪用 Dispose 要领,然后把属性设置为 null。
预计你也看到了,XamlLight 类还有一个成员—— GetId 要领,你也必需实现这个成员,然后你要返回一个字符串,这个字符串必需能够独一地代表你实现的这个类,最好的步伐是返回这个类的类名,因为这个一般都能独一的(我说的是包孕定名空间名字的)。那这个字符串又在哪里用呢?你再看,XamlLight 类有两对静态要领:
AddTargetElement 与 RemoveTargetElement:用来指定哪些元素能被灯光照见,Add 进去的可视化东西就能被照亮的,而 Remove 后的东西是不会被灯光照亮的,你会看到,要领的第一个参数是一个字符串类型的 lightId,对的,这就是上面我们实现 GetId 要领的感化了。
AddTargetBrush 与 RemoveTargetBrush:使灯光照射到画刷上,而不是照到可视化东西上,用法也一样,Add了的画刷会被照亮,Remove后的画刷是不被照亮的。
在应用灯光东西时你要记住,把它添加到 UIElement 东西的 Lights 列表中,仅仅说明为这个灯光布置了照射空间。这个前面在介绍灯光时老周讲过的,好比 PointLight ,它是点状光,你必需布置一个 CoordinateSpace 东西,作为灯光的参数,这比如你把蜡烛放在一个斗室子中,你不能把蜡烛放在野外,因为空矿的环境会严重削弱光线,所以,你得布置一个参照空间。此处,把自界说 XamlLight 放进 Lights 列表中,仅仅相当于你布置了这个 UI 元素作为参照空间而已,而这个空间内的子元素并不会真正应用灯光,所以,你必需挪用静态的 AddTargetElement 要领,指明里面的哪些子元素会被照亮。
如果你把灯光东西添加到 Grid 的 Lights 列表中,表白灯光是以这个 Grid 为参照空间,然后你挪用 AddTargetElement 要领,并把这个 Grid 元素传给要领,这说明整个 Grid 元素包孕它的子元素城市被照亮的。如果你只但愿 Grid 元素中某个子元素被照亮,就把子元素传给 AddTargetElement 要领。
好,说了那么多 F 话,咱们动手尝尝。
从 XamlLight 类派生,我们自界说一个灯源,叫 MyCustLight。
class MyCustLight : XamlLight { protected override string GetId() { return GetType().FullName; } protected override void OnConnected(UIElement newElement) { // 创建灯光 var compositor = Window.Current.Compositor; PointLight light = compositor.CreatePointLight(); // 设置灯光参数 light.Color = Colors.LightGreen; light.Offset = new System.Numerics.Vector3(240f, 80f, 20f); light.Intensity = 5.3f; // 为属性赋值 CompositionLight = light; // 这一句很重要 XamlLight.AddTargetElement(GetId(), newElement); } protected override void OnDisconnected(UIElement oldElement) { // 这一句是对应的,Add了之后就要Remove XamlLight.RemoveTargetElement(GetId(), oldElement); // 释放资源 CompositionLight.Dispose(); CompositionLight = null; } }