2017-05-24 55 views
0

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

回答

0

我認爲這個問題是一個事實,即在屬性設置前的構造函數執行。嘗試在PadViewPointsString 設置器(設置PadViewPoints後)添加此行:padView.LoadPoints(PadViewPoints);

+0

我試過了。 SignaturePadView類不包含LoadPoints的定義。我也嘗試添加'padView.Points = PadViewPoints;',那也沒用。 – HappyCoding

+0

那麼,如果你看看這個視圖源代碼的第81行[來源](https://github.com/xamarin/SignaturePad/blob/e931fa9f742c0904780c364c5d667d062d1fbdac/src/SignaturePad.Forms.Shared/SignaturePadView.cs#L81) ,做你想做的事的正確方法是'padView.Points = PadViewPoints',但是當你嘗試這樣做時,不知道拋出了什麼異常,我不能幫忙。所以你可以添加執行此行時拋出的異常(**在PadViewPointsString setter **)? –

+0

沒有任何異常被拋出。 – HappyCoding