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();
}
}
我試過了。 SignaturePadView類不包含LoadPoints的定義。我也嘗試添加'padView.Points = PadViewPoints;',那也沒用。 – HappyCoding
那麼,如果你看看這個視圖源代碼的第81行[來源](https://github.com/xamarin/SignaturePad/blob/e931fa9f742c0904780c364c5d667d062d1fbdac/src/SignaturePad.Forms.Shared/SignaturePadView.cs#L81) ,做你想做的事的正確方法是'padView.Points = PadViewPoints',但是當你嘗試這樣做時,不知道拋出了什麼異常,我不能幫忙。所以你可以添加執行此行時拋出的異常(**在PadViewPointsString setter **)? –
沒有任何異常被拋出。 – HappyCoding