【问题标题】:Xamarin SignaturePad - Loading points for a code generated SignaturePadView vs XAMLXamarin SignaturePad - 代码生成 SignaturePadView 与 XAML 的加载点
【发布时间】:2018-07-19 15:06:29
【问题描述】:

我将 SignaturePad 点存储到数据库中,目的是提取并存储到 PDF。得到它的工作,除了添加点到 SignaturePadView 对象。

要加分,我只是使用 signaturePad.Points = points.这种方法在插入显示到屏幕的 XAML SignaturePad 元素时效果很好......但存储到代码生成的 Object 会导致数组长度为零。

我在这两种情况下的代码如下。

我的问题是:
在尝试将点分配给生成的 SignaturePadView 时,我是否遗漏了一个步骤,和/或我没有呈现到屏幕(直接存储到 PDF)这一事实是否是一个潜在问题

XAML

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:local="clr-namespace:H1PaperlessApp"
            xmlns:forms="clr-namespace:SignaturePad.Forms;assembly=SignaturePad.Forms"
            x:Class="H1PaperlessApp.Views.Temppage"
            Padding="10">    
    <StackLayout>    
        <forms:SignaturePadView x:Name="PadView"
                            HeightRequest="150"
                            WidthRequest="240"
                            BackgroundColor="White"
                            StrokeColor="Black"
                            StrokeWidth="2"/>    
        <forms:SignaturePadView x:Name="ClonePadView"
                            HeightRequest="150"
                            WidthRequest="240"
                            BackgroundColor="White"
                            StrokeColor="Black"
                            StrokeWidth="2"/>    
        <Button Text="Save" FontSize="30" BackgroundColor="DodgerBlue" TextColor="White"
            Clicked="SaveButton_Clicked"/>    
    </StackLayout>
</ContentPage>

代码隐藏(从一个 XAML 生成的元素克隆到另一个)。在这种情况下,第二个 Points 设置正确

private async void SaveButton_Clicked(object sender, EventArgs e)
{
    var pnts = PadView.Points.ToArray(); // pnts = {Xamarin.Forms.Point[294]}
    var originalPoints = JsonConvert.SerializeObject(pnts);
    Xamarin.Forms.Point[] points = JsonConvert.DeserializeObject<Xamarin.Forms.Point[]>(originalPoints);
    ClonePadView.Points = points; // ClonePadView.Points = {Xamarin.Forms.Point[294]}
    Stream img = await ClonePadView.GetImageStreamAsync(SignatureImageFormat.Png);  
}

后面的代码(通过代码创建目标 SignaturePadView。注意第二个点的计数为 0)

private async void SaveButton_Clicked(object sender, EventArgs e)
{
    var pnts = PadView.Points.ToArray();  // pnts = {Xamarin.Forms.Point[294]}
    var originalPoints = JsonConvert.SerializeObject(pnts);
    Xamarin.Forms.Point[] points = JsonConvert.DeserializeObject<Xamarin.Forms.Point[]>(originalPoints);
    SignaturePadView CodeClonePadView = new SignaturePadView { };
    CodeClonePadView.Points = points;  // ClonePadView.Points = {Xamarin.Forms.Point[0]}
    Stream img = await CodeClonePadView.GetImageStreamAsync(SignatureImageFormat.Png);
}

【问题讨论】:

  • 我通过在 UI 线程中调用分配修复了 Xamarin.iOS 中的问题。在 Xamarin.Android 中,此解决方案不起作用。
  • 也许您应该先将代码创建的签名视图添加到布局中?否则它应该如何渲染任何东西?

标签: c# xaml xamarin.forms


【解决方案1】:

根据我的经验,SignaturePadView 必须可见并呈现,才能设置其点或笔触。您可以在页面的 Appearing 事件中执行此操作。

这是 XAML:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="SignaturePadPOC.MainPage" Appearing="MainPage_OnAppearing">

    <StackLayout x:Name="MyStackLayout">
    </StackLayout>

</ContentPage>

下面是代码:

public partial class MainPage : ContentPage
{
    public Point[][] Strokes { get; set; } // Set this prior to the appearing event;
    private SignaturePadView signatureView;

    public MainPage()
    {
        InitializeComponent();

        signatureView = new SignaturePadView
        {
            BackgroundColor = Color.White,
            StrokeColor = Color.Black,
            StrokeWidth = 3
        };
        MyStackLayout.Children.Add(signatureView);
    }

    private void MainPage_OnAppearing(object sender, EventArgs e)
    {
        signatureView.Strokes = Strokes;
    }
}

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多