#xaml #xamarin #xamarin.forms #uwp-xaml #xamarin.uwp
#xaml #xamarin #xamarin.forms #uwp-xaml #xamarin.uwp
Вопрос:
Мне нужен фрейм с пунктирной границей (как показано на изображении). Я ищу средство визуализации UWP, если у кого-нибудь есть какие-либо предложения по этому поводу, пожалуйста, поделитесь ими со мной. Я застрял с этим.
Ответ №1:
Пользовательский рендерер для пунктирной границы фрейма в UWP Xamarin
В настоящее время в UWP Xamarin нет такой пунктирной границы фрейма, но вы можете сделать ее Rectangle
доступной и установить доступной StrokeDashArray
для ее реализации, а затем использовать ViewRenderer
для ее отображения в Xamarin. Мы поделимся DashedBorderRenderer
ниже, для полного контроля, пожалуйста, обратитесь к образцу кода здесь.
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);
}
}