Xaml UWP Xamarin中帧虚线边框的自定义渲染器

Xaml UWP Xamarin中帧虚线边框的自定义渲染器,xaml,xamarin,xamarin.forms,uwp-xaml,xamarin.uwp,Xaml,Xamarin,Xamarin.forms,Uwp Xaml,Xamarin.uwp,我想要一个带有虚线边框的框架(如图所示)。我正在寻找UWP渲染器,如果有人对此有任何建议,请与我分享。我被这件事缠住了 UWP Xamarin中帧虚线边框的自定义渲染器 当前UWP Xamarin中没有这样的帧虚线边框,但您可以使用矩形将其设置为可用StrokeDashArray来实现它,然后使用ViewRenderer在Xamarin中渲染它。我们将在下面共享DashedBorderRenderer,有关完整控件,请参阅代码示例 公共类DashedBorderRenderer:ViewRen

我想要一个带有虚线边框的框架(如图所示)。我正在寻找UWP渲染器,如果有人对此有任何建议,请与我分享。我被这件事缠住了

UWP Xamarin中帧虚线边框的自定义渲染器

当前UWP Xamarin中没有这样的帧虚线边框,但您可以使用
矩形
将其设置为可用
StrokeDashArray
来实现它,然后使用
ViewRenderer
在Xamarin中渲染它。我们将在下面共享
DashedBorderRenderer
,有关完整控件,请参阅代码示例

公共类DashedBorderRenderer:ViewRenderer { 点边界_点边界; 框架元素_navivecontent; 双默认填充=2; 布尔等厚线; 公共虚线边界渲染器() { } 受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e) { 基础。一个要素发生变化(e); if(e.OldElement!=null) { _navtiveContent.Loaded-=本机\u Loaded; _navtiveContent.SizeChanged-=本机_SizeChanged; } if(例如NewElement!=null) { if(控件!=null) { var stroke=Element.DashedStroke==0?Element.DashedStroke:2.0; var borderColor=Element.borderColor.ToWindowsColor()==null?Element.borderColor.ToWindowsColor():Colors.Red; Control.DashedStroke=new Windows.UI.Xaml.Media.DoubleCollection(){stroke}; Control.StrokeBrush=new Windows.UI.Xaml.Media.SolidColorBrush(borderColor); } 其他的 { _dottedBorder=新的dottedBorder(); _navtiveContent=Element.Content.GetOrCreateRenderer().GetNativeElement()作为FrameworkElement; _navtiveContent.Loaded+=本机_Loaded; _navtiveContent.SizeChanged+=本机_SizeChanged; var stroke=Element.DashedStroke==0?2.0:Element.DashedStroke; var borderColor=Element.borderColor.ToWindowsColor()==null?Element.borderColor.ToWindowsColor():Colors.Red; _dottedBorder.DashedStroke=new Windows.UI.Xaml.Media.DoubleCollection(){stroke}; _dottedBorder.StrokeBrush=new Windows.UI.Xaml.Media.SolidColorBrush(borderColor); SetNativeControl(_dottedBorder); } } } 私有void本机\u SizeChanged(对象发送方,SizeChangedEventArgs e) { 更新(发送方); } 已加载私有void本地\u(对象发送方,RoutedEventArgs e) { 更新(发送方); } 私有void UpdateSize(对象发送方) { var content=发送方作为框架元素; if(内容为Windows.UI.Xaml.Controls.Image) { 如果(!等间距) { (内容为Windows.UI.Xaml.Controls.Image)。ImageOpened+=(s,e)=> { 等间距=真; var image=发件人为Windows.UI.Xaml.Controls.image; _dottedBorder.Height=image.ActualHeight+defaultPadding; _dottedBorder.Width=image.ActualWidth+defaultPadding; }; } 其他的 { _dottedBorder.Height=content.ActualHeight+defaultPadding; _dottedBorder.Width=content.ActualWidth+defaultPadding; } } _dottedBorder.Height=content.ActualHeight+defaultPadding; _dottedBorder.Width=content.ActualWidth+defaultPadding; } 受保护的覆盖无效OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs e) { base.OnElementPropertyChanged(发送方,e); } }
成功了,谢谢
public class DashedBorderRenderer : ViewRenderer<DashedBorder, DottedBorder>
{
    DottedBorder _dottedBorder;
    FrameworkElement _navtiveContent;
    double defaultPadding = 2;
    bool isOpened;
   
    public DashedBorderRenderer()
    {

    }

    protected override void OnElementChanged(ElementChangedEventArgs<DashedBorder> e)
    {
        base.OnElementChanged(e);
        if (e.OldElement != null)
        {
            _navtiveContent.Loaded -= Native_Loaded;
            _navtiveContent.SizeChanged -= Native_SizeChanged;
        }
        if (e.NewElement != null)
        {
            if (Control != null)
            {
                var stroke = Element.DashedStroke == 0 ? Element.DashedStroke : 2.0;
                var borderColor = Element.BorderColor.ToWindowsColor() == null ? Element.BorderColor.ToWindowsColor() : Colors.Red;
                Control.DashedStroke = new Windows.UI.Xaml.Media.DoubleCollection() { stroke };
                Control.StrokeBrush = new Windows.UI.Xaml.Media.SolidColorBrush(borderColor);
            }
            else
            {
                _dottedBorder = new DottedBorder();
                _navtiveContent = Element.Content.GetOrCreateRenderer().GetNativeElement() as FrameworkElement;
                _navtiveContent.Loaded += Native_Loaded;
                _navtiveContent.SizeChanged += Native_SizeChanged;

                var stroke = Element.DashedStroke == 0 ? 2.0 : Element.DashedStroke;
                var borderColor = Element.BorderColor.ToWindowsColor() == null ? Element.BorderColor.ToWindowsColor() : Colors.Red;
                _dottedBorder.DashedStroke = new Windows.UI.Xaml.Media.DoubleCollection() { stroke };
                _dottedBorder.StrokeBrush = new Windows.UI.Xaml.Media.SolidColorBrush(borderColor);

                SetNativeControl(_dottedBorder);
            }
        }

    }

    private void Native_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        UpdateSize(sender);
    }
    private void Native_Loaded(object sender, RoutedEventArgs e)
    {
        UpdateSize(sender);
    }
    private void UpdateSize(object sender)
    {
        var content = sender as FrameworkElement;
        if (content is Windows.UI.Xaml.Controls.Image)
        {

            if (!isOpened)
            {
                (content as Windows.UI.Xaml.Controls.Image).ImageOpened += (s, e) =>
                {
                    isOpened = true;
                    var image = sender as Windows.UI.Xaml.Controls.Image;
                    _dottedBorder.Height = image.ActualHeight + defaultPadding;
                    _dottedBorder.Width = image.ActualWidth + defaultPadding;
                };
            }
            else
            {
                _dottedBorder.Height = content.ActualHeight + defaultPadding;
                _dottedBorder.Width = content.ActualWidth + defaultPadding;
            }
            
        }
        _dottedBorder.Height = content.ActualHeight+defaultPadding;
        _dottedBorder.Width = content.ActualWidth + defaultPadding;
    }
    

 
    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);
    }
}