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

时间:2017-05-24 19:31:26

标签: c# xamarin.forms

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

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

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

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

ListView代码:

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
});
}

ItemView代码:

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();
        }
    }

1 个答案:

答案 0 :(得分:0)

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