2017-04-14 20 views
1

Ich arbeite gerade an einer App, die das Tool "TimePicker" in Blend für Visual Studio 2017 verwendet, und ich habe eine Frage zu einem Ereignis, das ich versuche zu finden. Nach dem Auswählen einer Zeit möchte ich separate Ereignisse haben, wenn die Prüftaste gedrückt wird, die die Zeit ändert, und wenn die X-Taste gedrückt wird, um abzubrechen und vom Flyout zurückzukehren. Ich glaube, dass ich das TimeChanged-Ereignis des TimePickers verwenden kann, um zu bestimmen, ob die Prüftaste gedrückt wurde, aber ich kann nicht herausfinden, welches Ereignis funktionieren würde, wenn die zu löschende x-Taste gedrückt wurde. Weiß jemand?UWP TimePicker Visual Studio 2017

Antwort

0

Es gibt keinen offensichtlichen Weg, es zu tun. Es gibt eine Schaltfläche zum Verwerfen in der TimePickerFlyoutPresenter, aber Zugriff darauf ist nicht genug. Sie müssen auch Tastaturkürzel wie die [ESC] -Taste verwalten.

Sie haben mich ein bisschen neugierig, wie man es hackt, also hier ist, was ich bis jetzt gekommen bin. Hier ist eine TimePickerDismissal Klasse, die ich sehr schnell gehackt habe. Die Idee ist, wenn der TimePicker Fokus erhält, nachdem er ein Popup gedrückt hat und es keine Zeitänderung gemeldet hat, dann wird es als eine Kündigung betrachtet.

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; 
    } 
} 

Hier ist, wie es zu benutzen:

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

geben, dass ein Schuss. Lass es mich wissen, wenn es für dich funktioniert. Sie können dies wahrscheinlich in ein Verhalten tatsächlich verwandeln ...

Verwandte Themen