如何判断在使用 Xamarin.Forms 创建的 TimePicker 上单击了“确定”还是“取消”?
How can I tell if OK or Cancel was clicked on a TimePicker created with Xamarin.Forms?
我正在开发一个基于 Xamarin.Forms 的 android 应用程序,我创建了一个显示 TimePicker(不是 TimePickerDialog)的自定义对话框。
到目前为止一切正常,除了我只找到一种方法来检查用户是否在 TimePicker 中进行了选择,即 TimePicker.Unfocused。
遗憾的是,该事件没有 return 选择器中的两个按钮中的哪一个被单击:(
我尝试通过节省我最初创建 TimePicker 的时间来解决这个问题,并用它来比较它是否被用户更改了。现在我已经更改了它,以便它可以方便地让您无需更改默认时间,并注意到现在这是一个问题,因为我无法再知道哪个按钮用于关闭 TimePicker。
var picker = new TimePicker() {
// if 'minutes' is set, use it's value as default value for the picker, otherwise the day beginning
Time = (minutes > -1 ? new TimeSpan(0, minutes, 0) : dayBegin),
};
picker.Unfocused += (sndr, evt) => {
var tp = (TimePicker)sndr;
var changed = tp.Time != oldTime;
if (changed) {
Debug.WriteLine("unfocused: " + tp.Time);
}
else {
Debug.WriteLine("canceled?");
}
dialog.Close(cpDialog.DialogResult.Yes);
// close my own dialog that showed the picker
};
如果 .Unfocused += 的事件除了 IsFocused 之外还包括结束选项,那就太好了。
或者,如果有其他附加事件,例如 .ClickedCancel += 和 .ClickedOK +=.
我想出了一个解决方法:通过将初始时间设置为带秒的时间,例如最后的 1 秒,可以将时间与初始时间进行比较。
如果秒数仍然存在,则用户单击了取消。
TimePicker Class 缺少例如在 DatePicker class ("DateSeleted")
中找到的事件“TimeSelected”
但是!
如果您查找 TimePicker Class,您可以看到那里有一些 BindableProperties。
其中之一是:
public static readonly BindableProperty TimeProperty;
这意味着,在您的 xaml 文件中,在 TimePicker 块 中,您可以将 TimeProperty 绑定到 属性 在您的 ViewModel 中,例如:
<TimePicker x:Name="DeliveryTimePicker"
Time="{Binding TimeValue}">
</TimePicker>
(TimeValue 是我在 ViewModel 中创建的 TimeSpan 类型的 属性)
当您单击 TimePicker 中的“确定”按钮时,属性 将更新。
(我相信这就是你想要的!)
(更多信息)
您也可以在您的 xaml 中直接绑定到其他 BindableProperties,您这样做的方法是键入它们的名称,而没有“属性”部分 TimeProperty - > 时间.
您还可以在 xaml 中订阅 PropertyChanged 事件并检查 属性 的名称是否与您要查找的名称相同。
出于调试目的,创建该方法,放置一个断点并查找 event.PropertyName,并观察断点被击中几次,属性 的名称在创建 TimePicker 时会有所不同, 点击确定等
我正在开发一个基于 Xamarin.Forms 的 android 应用程序,我创建了一个显示 TimePicker(不是 TimePickerDialog)的自定义对话框。
到目前为止一切正常,除了我只找到一种方法来检查用户是否在 TimePicker 中进行了选择,即 TimePicker.Unfocused。
遗憾的是,该事件没有 return 选择器中的两个按钮中的哪一个被单击:(
我尝试通过节省我最初创建 TimePicker 的时间来解决这个问题,并用它来比较它是否被用户更改了。现在我已经更改了它,以便它可以方便地让您无需更改默认时间,并注意到现在这是一个问题,因为我无法再知道哪个按钮用于关闭 TimePicker。
var picker = new TimePicker() {
// if 'minutes' is set, use it's value as default value for the picker, otherwise the day beginning
Time = (minutes > -1 ? new TimeSpan(0, minutes, 0) : dayBegin),
};
picker.Unfocused += (sndr, evt) => {
var tp = (TimePicker)sndr;
var changed = tp.Time != oldTime;
if (changed) {
Debug.WriteLine("unfocused: " + tp.Time);
}
else {
Debug.WriteLine("canceled?");
}
dialog.Close(cpDialog.DialogResult.Yes);
// close my own dialog that showed the picker
};
如果 .Unfocused += 的事件除了 IsFocused 之外还包括结束选项,那就太好了。 或者,如果有其他附加事件,例如 .ClickedCancel += 和 .ClickedOK +=.
我想出了一个解决方法:通过将初始时间设置为带秒的时间,例如最后的 1 秒,可以将时间与初始时间进行比较。 如果秒数仍然存在,则用户单击了取消。
TimePicker Class 缺少例如在 DatePicker class ("DateSeleted")
中找到的事件“TimeSelected”但是!
如果您查找 TimePicker Class,您可以看到那里有一些 BindableProperties。
其中之一是:
public static readonly BindableProperty TimeProperty;
这意味着,在您的 xaml 文件中,在 TimePicker 块 中,您可以将 TimeProperty 绑定到 属性 在您的 ViewModel 中,例如:
<TimePicker x:Name="DeliveryTimePicker"
Time="{Binding TimeValue}">
</TimePicker>
(TimeValue 是我在 ViewModel 中创建的 TimeSpan 类型的 属性)
当您单击 TimePicker 中的“确定”按钮时,属性 将更新。
(我相信这就是你想要的!)
(更多信息)
您也可以在您的 xaml 中直接绑定到其他 BindableProperties,您这样做的方法是键入它们的名称,而没有“属性”部分 TimeProperty - > 时间.
您还可以在 xaml 中订阅 PropertyChanged 事件并检查 属性 的名称是否与您要查找的名称相同。
出于调试目的,创建该方法,放置一个断点并查找 event.PropertyName,并观察断点被击中几次,属性 的名称在创建 TimePicker 时会有所不同, 点击确定等