blob: 441274238fefc39331fd79f7df113b758b102e59 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
using System;
using Windows.UI.Core;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
#if WINDOWS_UWP
namespace Xamarin.Forms.Platform.UWP
#else
namespace Xamarin.Forms.Platform.WinRT
#endif
{
public class FormsDatePicker : Windows.UI.Xaml.Controls.DatePicker
{
public FormsDatePicker()
{
if (Device.Idiom == TargetIdiom.Desktop || Device.Idiom == TargetIdiom.Tablet)
{
Loaded += (sender, args) => { Window.Current.Activated += WindowOnActivated; };
Unloaded += (sender, args) => { Window.Current.Activated -= WindowOnActivated; };
}
}
public event EventHandler<EventArgs> ForceInvalidate;
protected override void OnApplyTemplate()
{
base.OnApplyTemplate();
if (Device.Idiom == TargetIdiom.Desktop || Device.Idiom == TargetIdiom.Tablet)
{
// Look for the combo boxes which make up a DatePicker on Windows 8.1
// So we can hook into their closed events and invalidate them if necessary
var dayPicker = GetTemplateChild("DayPicker") as ComboBox;
if (dayPicker != null)
{
dayPicker.DropDownClosed += PickerOnDropDownClosed;
}
var monthPicker = GetTemplateChild("MonthPicker") as ComboBox;
if (monthPicker != null)
{
monthPicker.DropDownClosed += PickerOnDropDownClosed;
}
var yearPicker = GetTemplateChild("YearPicker") as ComboBox;
if (yearPicker != null)
{
yearPicker.DropDownClosed += PickerOnDropDownClosed;
}
}
}
void PickerOnDropDownClosed(object sender, object o)
{
// If the DatePicker is in a TableView or ListView and the user
// opens one of the dropdowns but does not actually change the value,
// when the dropdown closes, the selected value will go blank
// To fix this, we have to invalidate the control
// This only applies to Windows 8.1
ForceInvalidate?.Invoke(this, EventArgs.Empty);
}
void WindowOnActivated(object sender, WindowActivatedEventArgs windowActivatedEventArgs)
{
// If the DatePicker is in a TableView or ListView, when the application loses and then regains focus
// the TextBlock/ComboBox controls (UWP and 8.1, respectively) which display its selected value
// will go blank.
// To fix this, we have to signal the renderer to invalidate if
// Window.Activated occurs.
ForceInvalidate?.Invoke(this, EventArgs.Empty);
}
}
}
|