微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决UWP Xamarin 中框架虚线边框的自定义渲染器

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

enter image description here

解决方法

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

目前在 UWP Xamarin 中没有这种框架的虚线边框,但您可以使用 Rectangle 并设置可用的 StrokeDashArray 来实现它,然后使用 ViewRenderer 将其呈现在哈马林。我们将在下面分享DashedBorderRenderer,完整的控制请参考代码示例here

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);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。