繁体   English   中英

如何判断是在使用 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。

可悲的是,该事件不会返回选择器中的两个按钮中的哪一个被点击了:(

我尝试通过节省我最初创建 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 +=。

TimePicker 类缺少例如在 DatePicker 类(“DateSeleted”)中找到的事件“TimeSelected”

但!

如果您查找 TimePicker 类,您会看到那里有一些 BindableProperties。

其中之一是:

public static readonly BindableProperty TimeProperty;

这意味着,在您的 xaml 文件中,在TimePicker 块中,您可以将TimeProperty绑定到 ViewModel 中的属性,例如:

<TimePicker x:Name="DeliveryTimePicker"
            Time="{Binding TimeValue}">
</TimePicker>

(TimeValue 是我在 ViewModel 中创建的 TimeSpan 类型的属性)

当您单击 TimePicker 中的“确定”按钮时,该属性将更新。

(我相信这就是你想要的!)

(更多信息)

您也可以直接在 xaml 中将 BindableProperty 绑定到其他 BindableProperties,这样做的方式是键入它们的名称,而无需“属性”部分TimeProperty -> Time

您还可以在您的 xaml 中订阅 PropertyChanged 事件并检查属性的名称是否与您要查找的名称相同。

出于调试目的,创建该方法,放置一个断点并查找 event.PropertyName,并观察多次命中该断点,在创建 TimePicker、单击 Ok 等时,该属性的名称将有所不同。

我想出了一个解决方法:通过将初始时间设置为几秒,比如最后 1 秒,可以将时间与初始时间进行比较。 如果秒数仍然存在,则用户单击取消。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM