2017-03-07 151 views
2

我使用Xamarin.Forms,我有Image。我想与Corner RadiusBorder Width对接。我可以做吗 ?我尝试使用Frame。这很好,但它只有Border Width = 1,我不能改变这一点。我知道Effect,但我不想使用它们。我可以做它例如使用矩形或任何方式?Xamarin.Forms框架边框宽度

+0

是否有一个具体的理由,为什么你不希望使用效果如何?设置Frame的边框宽度的问题对他们来说变得相当微不足道。 – hankide

+0

我以为有没有效果的方式,只有PCL。如果没有这种方法,我会做'效果' –

回答

2

您可以使用效果创建自己的实现,也可以扩展FreshEssentials开放源代码库。他们有一个名为AdvancedFrame的控件,它为所有平台上的Frame控件提供自定义渲染器。

如果您查看每个特定于平台的项目,您会注意到AdvancedFrameRenderer类为创建圆角支持创建了更加复杂的路径。你只需要深入到每个平台上的Draw方法(iOS,Android),并找出如何设置笔触宽度。

从Android开始,最简单的方法是在代码中定义笔画宽度(on this line)。您只需要在AdvancedFrame控件中为该属性创建一个属性,以便每个控件都可以有不同的宽度。我不知道如何在iOS上设置笔触宽度,但它使用UIBezierPath,它应该很容易修改。

1

你可以尝试这样的事情:

<Frame HasShadow="False" CornerRadius="25" Padding="2" BackgroundColor="#F69927"> 
    <Frame HasShadow="False" CornerRadius="23" BackgroundColor="White" Padding="12"> 
     <StackLayout Orientation="Horizontal" HorizontalOptions="CenterAndExpand" VerticalOptions="Start"> 
      <!-- Content -->     
     </StackLayout> 
    </Frame> 
</Frame> 
0

我试着用FrameRenderer跳舞Android和我找到了一些解决方案。 不好的一面是,要成为MyFrameRenderer类中可见的边框颜色,宽度和角半径变量,我必须创建MyFrame:Frame类来仅影响我自己的框架类型。关闭够我的目的......所以:

namespace PROJECT 
{ 
    public class MyFrame : Xamarin.Forms.Frame 
    { 
     public static float myFrameWidth = 2; 
     public static float myCornerRadius = 12; 
     public static Color myFrameColor = Color.Red; 
     public static Color myBackgroundColor = Color.Black; 

     public MyFrame() { } 
    } 
} 

...

[assembly: ExportRenderer(typeof(PROJECT.MyFrame), typeof(PROJECT.Droid.MyFrameRenderer))] 
namespace PROJECT.Droid 
{ 
    class MyFrameRenderer : FrameRenderer 
    { 
     protected override void OnDraw(Android.Graphics.Canvas canvas) 
     { 
      // canvas contains image of standard outline 
      // to "hide" it, not efficent but sometimes "close enough solution" 
      // is to overlay that outline by new one in our's page background color 
      // then draw a new one in prefered style 
      // or... just draw thicker one over the old 

      var my1stPaint = new Android.Graphics.Paint(); 
      var my2ndPaint = new Android.Graphics.Paint(); 
      var backgroundPaint = new Android.Graphics.Paint(); 

      my1stPaint.AntiAlias = true; 
      my1stPaint.SetStyle(Paint.Style.Stroke); 
      my1stPaint.StrokeWidth = MyFrame.myFrameWidth + 2; 
      my1stPaint.Color = MyFrame.myFrameColor.ToAndroid(); 

      my2ndPaint.AntiAlias = true; 
      my2ndPaint.SetStyle(Paint.Style.Stroke); 
      my2ndPaint.StrokeWidth = MyFrame.myFrameWidth; 
      my2ndPaint.Color = MyFrame.myBackgroundColor.ToAndroid(); 

      backgroundPaint.SetStyle(Paint.Style.Stroke); 
      backgroundPaint.StrokeWidth = 4; 
      backgroundPaint.Color = MyFrame.myBackgroundColor.ToAndroid(); 

      Rect oldBounds = new Rect(); 
      canvas.GetClipBounds(oldBounds); 

      RectF oldOutlineBounds = new RectF(); 
      oldOutlineBounds.Set(oldBounds); 

      RectF myOutlineBounds = new RectF(); 
      myOutlineBounds.Set(oldBounds); 
      myOutlineBounds.Top += (int)my2ndPaint.StrokeWidth+3; 
      myOutlineBounds.Bottom -= (int)my2ndPaint.StrokeWidth+3; 
      myOutlineBounds.Left += (int)my2ndPaint.StrokeWidth+3; 
      myOutlineBounds.Right -= (int)my2ndPaint.StrokeWidth+3; 

      canvas.DrawRoundRect(oldOutlineBounds, 10, 10, backgroundPaint); //to "hide" old outline 
      canvas.DrawRoundRect(myOutlineBounds, MyFrame.myCornerRadius, MyFrame.myCornerRadius, my1stPaint); 
      canvas.DrawRoundRect(myOutlineBounds, MyFrame.myCornerRadius, MyFrame.myCornerRadius, my2ndPaint); 

      base.OnDraw(canvas); 
     } 

     protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Frame> e) 
     { 
      base.OnElementChanged(e); 
     } 
    } 
} 

enter image description here