问题描述
我在我的应用程序中使用了日期选择器和时间选择器。
我为日期选择器和时间选择器实现了焦点和非焦点事件。 使用 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;
...
}