使用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 :(得分:0)
我认为问题在于构造函数在设置属性之前执行。尝试在PadViewPointsString setter 的末尾添加此行(在设置PadViewPoints之后):padView.LoadPoints(PadViewPoints);