【问题标题】:Custom Renderer for Dashed Border of frame in UWP XamarinUWP Xamarin 中框架虚线边框的自定义渲染器
【发布时间】:2021-05-01 19:19:09
【问题描述】:

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

【问题讨论】:

    标签: xaml xamarin xamarin.forms uwp-xaml xamarin.uwp


    【解决方案1】:

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

    目前在 UWP Xamarin 中没有这样的虚线边框,但是您可以使用 Rectangle 来实现它并设置可用的 StrokeDashArray 来实现它,然后使用 ViewRenderer 在 Xamarin 中呈现它。我们将在下面分享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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 2019-03-28
      • 2019-02-16
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 2020-10-19
      相关资源
      最近更新 更多