UWP 时间选择器 Visual Studio 2017
UWP TimePicker Visual Studio 2017
我目前正在开发一个应用程序,该应用程序在 Visual Studio 2017 年使用 Blend 中的工具 "TimePicker",我对我要查找的事件有疑问。选择时间后,我希望在按下更改时间的复选按钮时发生单独的事件,如果按下 X 按钮取消和弹出窗口中的 return。我确实相信我可以使用 TimePicker 的 TimeChanged 事件来判断是否按下了复选按钮,但我无法确定如果按下要取消的 x 按钮,哪个事件会起作用。有人知道吗?
没有明显的方法可以做到这一点。 TimePickerFlyoutPresenter
中有一个关闭按钮,但访问该按钮还不够。您还需要管理键盘快捷键,例如 [ESC] 键。
你让我有点好奇如何破解它,所以这就是我到目前为止的想法。这是 TimePickerDismissal
class 我很快就搞定了。这个想法是,如果 TimePicker
在推送弹出窗口后获得焦点并且没有报告时间更改,那么它被认为是关闭。
public class TimePickerDismissal
{
private bool _active;
private bool _timeChanged;
public event EventHandler Dismissed;
public TimePickerDismissal(TimePicker timer)
{
timer.GotFocus += OnTimeGotFocus;
timer.LostFocus += OnTimeLostFocus;
timer.TimeChanged += OnTimeChanged;
}
private void OnTimeGotFocus(object sender, RoutedEventArgs e)
{
if (!_active)
{
return;
}
_active = false;
if (!_timeChanged)
{
Dismissed?.Invoke(this, EventArgs.Empty);
}
_timeChanged = false;
}
private void OnTimeLostFocus(object sender, RoutedEventArgs e)
{
var selector = FocusManager.GetFocusedElement() as LoopingSelector;
if (selector == null)
{
return;
}
_active = true;
}
private void OnTimeChanged(object sender, TimePickerValueChangedEventArgs e)
{
_timeChanged = true;
}
}
使用方法如下:
public sealed partial class MainPage
{
public MainPage()
{
InitializeComponent();
var dismissal = new TimePickerDismissal(MyTimePicker);
dismissal.Dismissed += OnTimerDismissed;
}
private void OnTimerDismissed(object sender, EventArgs e)
{
Debug.WriteLine("TimePicker dismissed!");
}
}
试一试。请让我知道这对你有没有用。您实际上可以将其转化为行为...
我目前正在开发一个应用程序,该应用程序在 Visual Studio 2017 年使用 Blend 中的工具 "TimePicker",我对我要查找的事件有疑问。选择时间后,我希望在按下更改时间的复选按钮时发生单独的事件,如果按下 X 按钮取消和弹出窗口中的 return。我确实相信我可以使用 TimePicker 的 TimeChanged 事件来判断是否按下了复选按钮,但我无法确定如果按下要取消的 x 按钮,哪个事件会起作用。有人知道吗?
没有明显的方法可以做到这一点。 TimePickerFlyoutPresenter
中有一个关闭按钮,但访问该按钮还不够。您还需要管理键盘快捷键,例如 [ESC] 键。
你让我有点好奇如何破解它,所以这就是我到目前为止的想法。这是 TimePickerDismissal
class 我很快就搞定了。这个想法是,如果 TimePicker
在推送弹出窗口后获得焦点并且没有报告时间更改,那么它被认为是关闭。
public class TimePickerDismissal
{
private bool _active;
private bool _timeChanged;
public event EventHandler Dismissed;
public TimePickerDismissal(TimePicker timer)
{
timer.GotFocus += OnTimeGotFocus;
timer.LostFocus += OnTimeLostFocus;
timer.TimeChanged += OnTimeChanged;
}
private void OnTimeGotFocus(object sender, RoutedEventArgs e)
{
if (!_active)
{
return;
}
_active = false;
if (!_timeChanged)
{
Dismissed?.Invoke(this, EventArgs.Empty);
}
_timeChanged = false;
}
private void OnTimeLostFocus(object sender, RoutedEventArgs e)
{
var selector = FocusManager.GetFocusedElement() as LoopingSelector;
if (selector == null)
{
return;
}
_active = true;
}
private void OnTimeChanged(object sender, TimePickerValueChangedEventArgs e)
{
_timeChanged = true;
}
}
使用方法如下:
public sealed partial class MainPage
{
public MainPage()
{
InitializeComponent();
var dismissal = new TimePickerDismissal(MyTimePicker);
dismissal.Dismissed += OnTimerDismissed;
}
private void OnTimerDismissed(object sender, EventArgs e)
{
Debug.WriteLine("TimePicker dismissed!");
}
}
试一试。请让我知道这对你有没有用。您实际上可以将其转化为行为...