微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对于 xamarin 形式的日期选择器和时间选择器,焦点和取消焦点事件多次触发

如何解决对于 xamarin 形式的日期选择器和时间选择器,焦点和取消焦点事件多次触发

我在我的应用程序中使用了日期选择器和时间选择器。

我为日期选择器和时间选择器实现了焦点和非焦点事件。 使用 focus 和 unfocus 事件验证最大日期的时间。

那些 focus 和 unfocus 事件被多次触发。 当我们点击日期选择器或时间选择器时需要触发一次。

XAML:

<controls:DatePickerCustom x:Name="DatePicker" FontSize="14" HeightRequest="35" Date="{Binding CustomDate,Mode=TwoWay}" MaximumDate="{Binding MaximumDate}" FontFamily="Segoe UI" Format="D"  HorizontalOptions="FillAndExpand" Unfocused="DatePickerUnfocused" TranslationX="-4">
                                    <DatePicker.Triggers>
                                        <DataTrigger targettype="DatePicker" Binding="{Binding IsCustomSelected}" Value="true">
                                            <Setter Property="TextColor" Value="{DynamicResource headingTextColor}" />
                                            <Setter Property="TextColor" Value="{DynamicResource headingTextColor}" />
                                        </DataTrigger>
                                    </DatePicker.Triggers>
                                </controls:DatePickerCustom>


<controls:TimePickerCustom x:Name="TimePicker" FontSize="14" HeightRequest="35" Time="{Binding CustomTime,Mode=TwoWay}" FontFamily="Segoe UI" Focused="TimePickerFocused" Unfocused="TimePickerUnfocused" >
                                    <TimePicker.Triggers>
                                        <DataTrigger targettype="TimePicker" Binding="{Binding IsCustomSelected}" Value="true">
                                            <Setter Property="TextColor" Value="{DynamicResource headingTextColor}" />
                                        </DataTrigger>
                                    </TimePicker.Triggers>
                                </controls:TimePickerCustom>

CS:

protected void TimePickerUnfocused(object sender,FocusEventArgs e)
        {
            TimePicker picker = sender as TimePicker;
            if (DatePicker.Date.ToString("dd/MM/yyyy") == DatePicker.MaximumDate.ToString("dd/MM/yyyy"))
            {
                //var t1 = Convert.ToDateTime(DateTime.Now).ToString("HH:mm");
                //var t2 = Convert.ToDateTime(picker.Time.ToString()).ToString("HH:mm");

                var result = DateTime.Compare(Convert.ToDateTime(Convert.ToDateTime(DateTime.Now).ToString("HH:mm")),Convert.ToDateTime(Convert.ToDateTime(picker.Time.ToString()).ToString("HH:mm")));

                if (result > 0)
                {
                    if (endValue.ToString() != "00:00:00")
                    {
                        TimePicker.Time = endValue;
                    }
                    else
                    {
                        endValue = picker.Time;
                        TimePicker.Time = endValue;
                    }
                }
                else
                {
                    displayAlert("Alert!","Please select the valid time","OK");
                    TimePicker.Time = TimeSpan.Parse(DateTime.Now.AddHours(-1).ToString("HH:mm"));
                }
            }

        }

        protected void DatePickerUnfocused(object sender,FocusEventArgs e)
        {
            if (DatePicker.Date.ToString("dd/MM/yyyy HH:mm") == DatePicker.MaximumDate.ToString("dd/MM/yyyy HH:mm"))
            {
                if(endValue.ToString() != "00:00:00")
                {
                    TimePicker.Time = endValue;
                }
                else if (startValue.ToString() != "00:00:00")
                {
                    TimePicker.Time = startValue;
                }
                else
                {
                    startValue= TimeSpan.Parse(DateTime.Now.AddHours(-1).ToString("HH:mm"));
                    TimePicker.Time = startValue;
                }
            }
        }

        protected void TimePickerFocused(object sender,FocusEventArgs e)
        {
            if (DatePicker.Date.ToString("dd/MM/yyyy HH:mm") == DatePicker.MaximumDate.ToString("dd/MM/yyyy HH:mm") && startValue != null)
            {
                TimePicker.Time = startValue;
            }
        }

日期选择器的 MinimumDate 和 MaximumDate 属性在 Android 10 版本真机中不起作用。相同的属性在模拟器中工作。

解决方法

可能的解决方法:

根据特定选择器是否获得焦点设置一个布尔值。忽略任何重复的焦点消息。

DatePicker 示例:

private bool _datePickerFocused = false;

protected void DatePickerFocused(...)
{
    // Skip if already focused.
    if (_datePickerFocused)
        return;

    _datePickerFocused = true;
    ...
}

protected void DatePickerUnfocused(...)
{
    // Skip if not focused.
    if (!_datePickerFocused)
        return;

    _datePickerFocused = false;
    ...
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。