【问题标题】:How may I load the points/restore the points to display a signature?如何加载积分/恢复积分以显示签名?
【发布时间】:2017-10-25 07:24:21
【问题描述】:

使用Xamarin Signature Pad Xamarin.Forms 代码和示例,我开发了以下内容。

我使用 Json 序列化签名 Point[] 数组并将其存储在数据库中。当用户选择一个列表项时,签名数据Point[] 字符串会从数据库中提取并反序列化并存储在Point[] 中。我看到 Xamarin 签名板文档说我可以通过以下 signature.LoadPoints (points); 行加载签名。

我在创建 padView 后尝试在 ItemView 代码中执行此操作,但没有成功。

如何加载积分/恢复积分以显示签名?

列表视图代码:

async void OnListItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    ((App)App.Current).ResumeAtDatabaseId = (e.SelectedItem as DatabaseItem).ID;
    Debug.WriteLine("setting ResumeAtDatabaseId = " + (e.SelectedItem as DatabaseItem).ID);

    await Navigation.PushAsync(new DatabaseItemView
    {
        //BindingContext = e.SelectedItem as DatabaseItem
        Name = (e.SelectedItem as DatabaseItem).Name,
        Date = Convert.ToDateTime((e.SelectedItem as DatabaseItem).Date),
        PadViewPointsString = (e.SelectedItem as DatabaseItem).SignatureData
});
}

项目查看代码:

public partial class DatabaseItemView : ContentPage
    {
        public string Name { get => Name.Text; set => Name.Text = value; }
        public DateTime Date { get => Date.Date; set => Date.Date = value; }
        public SignaturePadView PadView { get => padView; set => padView = value; }
        public string PadViewPointsString
        {
            get => padViewPointsString;
            set
            {
                padViewPointsString = value;
                if (value != null)
                {
                    PadViewPoints = JsonConvert.DeserializeObject<Xamarin.Forms.Point[]>(value);
                }
            }
        }
        public Xamarin.Forms.Point[] PadViewPoints { get => padViewPoints; set => padViewPoints = value; }

        private Entry Name;
        private DatePicker Date;
        private SignaturePadView padView;
        private IEnumerable<Point> signatureData;
        private string padViewPointsString;
        private Point[] padViewPoints;

        public DatabaseItemView ()
        {
            //InitializeComponent ();

            //Name
            Name = new Entry
            {
                Placeholder = "Name"
            };
            //Name.SetBinding(Entry.TextProperty, "Name");            

            //Date
            Date = new DatePicker
            {
                Date = DateTime.Now.Date
            };
            //Date.SetBinding(DatePicker.DateProperty, "Date");

            //signature
            padView = new SignaturePadView
            {
                HeightRequest = 150, WidthRequest = 240,
                BackgroundColor = Color.White,
                CaptionText = "Caption This", CaptionTextColor = Color.Black,
                ClearText = "Clear Me!", ClearTextColor = Color.Red,
                PromptText = "Prompt Here", PromptTextColor = Color.Red,
                SignatureLineColor = Color.Aqua, StrokeColor = Color.Black, StrokeWidth = 2
            };

            //signatureData

            //saveButton
            var saveButton = new Button
            {
                Text = "Save",
                HorizontalOptions = LayoutOptions.FillAndExpand,
                Font = Font.SystemFontOfSize(NamedSize.Large),
                //Command = new Command(() => App.NavigateTo<DatabaseItemViewModel>()),
            };
            saveButton.Clicked += OnSaveButtonClicked;

            //build the page
            Content = new StackLayout
            {
                Spacing = 20,
                Padding = 50,
                //VerticalOptions = LayoutOptions.Center,
                Children =
                {
                    Name,
                    Date,
                    padView,
                    saveButton
                }
            };
        }

        async void OnSaveButtonClicked(object sender, EventArgs e)
        {
            var temp = padView.Points;
            var tempArray = padView.Points.ToArray();
            //serialize tempArray to json and store as text
            string json = JsonConvert.SerializeObject(tempArray);

            var databaseItem = new DatabaseItem
            {
                ID = ((App)App.Current).ResumeAtDatabaseId,
                Name = Name.Text,
                Date = Date.Date.ToString(),
                SignatureData = json
            };
            //var databaseItem = (DatabaseItem)BindingContext;
            await App.Database.SaveItemAsync(databaseItem);
            await Navigation.PopAsync();
        }
    }

【问题讨论】:

    标签: c# xamarin.forms


    【解决方案1】:

    我认为问题在于构造函数在设置属性之前执行。尝试在 PadViewPointsString setter 末尾添加这一行(设置 PadViewPoints 之后):padView.LoadPoints(PadViewPoints);

    【讨论】:

    • 我试过了。 SignaturePadView 类不包含 LoadPoints 的定义。我也尝试添加padView.Points = PadViewPoints;,但也没有用。
    • 好吧,如果你看一下这个视图源代码的第81行source,正确的做法是padView.Points = PadViewPoints,但是不知道你尝试的时候会抛出什么异常要做到这一点,我无能为力。那么你可以添加执行此行时抛出的异常(在PadViewPointsString setter)?
    • 没有抛出异常。
    • 那么,您检查点是否正确反序列化?在致电padView.Points = PadViewPoints 之前,您是否看到它的价值?
    • 我做到了。因此,这可能会有所帮助,也可能很奇怪->我创建了一个按钮并在我有padView.Points = PadViewPoints;的方法内部创建了一个方法padView.Points = PadViewPoints;,并在单击按钮时按预期加载了签名。我不确定为什么这有效而另一种方法无效。我不想依靠单击按钮来加载签名。
    猜你喜欢
    • 1970-01-01
    • 2015-01-23
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2021-04-21
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多