Xaml UWP Xamarin中帧虚线边框的自定义渲染器
我想要一个带有虚线边框的框架(如图所示)。我正在寻找UWP渲染器,如果有人对此有任何建议,请与我分享。我被这件事缠住了 UWP Xamarin中帧虚线边框的自定义渲染器 当前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
矩形
将其设置为可用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);
}
}