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!");
    }
}

试一试。请让我知道这对你有没有用。您实际上可以将其转化为行为...