【问题标题】:How can I tell if OK or Cancel was clicked on a TimePicker created with Xamarin.Forms?如何判断在使用 Xamarin.Forms 创建的 TimePicker 上单击了确定还是取消?
【发布时间】:2019-09-03 13:43:31
【问题描述】:

我正在开发一个基于 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 +=。

【问题讨论】:

  • TBH,您应该使用 MVVM,这个问题可能不是问题。

标签: c# xamarin.forms timepicker


【解决方案1】:

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

但是!

如果你查看 TimePicker 类,你可以看到那里有一些 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 -> Time

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

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

【讨论】:

  • 即使值不变,属性是否也会更新?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2012-10-20
    • 2013-10-09
    • 2015-07-06
    相关资源
    最近更新 更多