using CPF.Drawing; using CPF.Platform; using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; namespace CPF.Controls { /// /// 用于内嵌原生控件,一般来说原生控件无法使用渲染变换,无法调整ZIndex,只能在最前端,可能无法透明。一般尽可能少用该控件 /// [Description("用于内嵌原生控件,一般来说原生控件无法使用渲染变换,无法调整ZIndex,只能在最前端,可能无法透明。一般尽可能少用该控件")] public class NativeElement : UIElement { /// /// 用于内嵌原生控件,一般来说原生控件无法使用渲染变换,无法调整ZIndex,只能在最前端,可能无法透明。一般尽可能少用该控件 /// public NativeElement() { } INativeImpl nativeImpl; protected override bool OnSetValue(string propertyName, ref object value) { if (propertyName == nameof(RenderTransform) || propertyName == nameof(Effect) || propertyName == nameof(ZIndex)) { throw new NotSupportedException("不支持" + propertyName); } return base.OnSetValue(propertyName, ref value); } /// /// 设置对应平台的控件句柄 /// [Description("设置对应平台的控件句柄")] public object Content { get { return GetValue(); } set { SetValue(value); } } /// /// 背景色,有些平台可能无法透明 /// [Description("背景色,有些平台可能无法透明"), UIPropertyMetadata(typeof(Color), "#fff", UIPropertyOptions.AffectsRender)] public Color BackColor { get { return (Color)GetValue(); } set { SetValue(value); } } [Browsable(false)] public INativeImpl NativeImpl { get => nativeImpl; } [PropertyChanged(nameof(Content))] void OnContentChanged(object newValue, object oldValue, PropertyMetadataAttribute attribute) { nativeImpl?.SetContent(newValue); } [PropertyChanged(nameof(BackColor))] void OnBackColorChanged(object newValue, object oldValue, PropertyMetadataAttribute attribute) { nativeImpl?.SetBackColor((Color)newValue); } protected override void OnAttachedToVisualTree() { if (!DesignMode) { nativeImpl = Application.GetRuntimePlatform().CreateNative(); nativeImpl.SetOwner(this); nativeImpl.SetContent(Content); nativeImpl.SetBackColor(BackColor); nativeImpl.SetParent(Root.ViewImpl); Root.LayoutManager.nativeElements.Add(this); } base.OnAttachedToVisualTree(); } protected override void OnDetachedFromVisualTree() { nativeImpl?.SetParent(null); Root.LayoutManager.nativeElements.Remove(this); base.OnDetachedFromVisualTree(); } protected override void OnRender(DrawingContext dc) { if (DesignMode) { using (var sb = new SolidColorBrush(BackColor)) { dc.FillRectangle(sb, new Rect(0, 0, ActualSize.Width, ActualSize.Height)); } } base.OnRender(dc); } protected override void Dispose(bool disposing) { nativeImpl?.Dispose(); base.Dispose(disposing); } } }