markus / MarkusAutoUpdate / src / NetSparkle.UI.WPF / UpdateAvailableWindow.xaml.cs @ d8f5045e
이력 | 보기 | 이력해설 | 다운로드 (4.77 KB)
1 |
using NetSparkleUpdater.Enums; |
---|---|
2 |
using NetSparkleUpdater.Events; |
3 |
using NetSparkleUpdater.Interfaces; |
4 |
using NetSparkleUpdater.UI.WPF.Controls; |
5 |
using NetSparkleUpdater.UI.WPF.Interfaces; |
6 |
using NetSparkleUpdater.UI.WPF.ViewModels; |
7 |
using System; |
8 |
using System.Collections.Generic; |
9 |
using System.Linq; |
10 |
using System.Text; |
11 |
using System.Threading; |
12 |
using System.Threading.Tasks; |
13 |
using System.Windows; |
14 |
using System.Windows.Controls; |
15 |
using System.Windows.Data; |
16 |
using System.Windows.Documents; |
17 |
using System.Windows.Input; |
18 |
using System.Windows.Media; |
19 |
using System.Windows.Media.Imaging; |
20 |
using System.Windows.Navigation; |
21 |
using System.Windows.Shapes; |
22 |
|
23 |
namespace NetSparkleUpdater.UI.WPF |
24 |
{ |
25 |
/// <summary> |
26 |
/// Interaction logic for UpdateAvailableWindow.xaml |
27 |
/// </summary> |
28 |
public partial class UpdateAvailableWindow : BaseWindow, IUpdateAvailable, IReleaseNotesUpdater, IUserRespondedToUpdateCheck |
29 |
{ |
30 |
private UpdateAvailableWindowViewModel _dataContext; |
31 |
private bool _hasFinishedNavigatingToAboutBlank = false; |
32 |
private string _notes = ""; |
33 |
|
34 |
public UpdateAvailableWindow() : base(true) |
35 |
{ |
36 |
InitializeComponent(); |
37 |
} |
38 |
|
39 |
public UpdateAvailableWindow(UpdateAvailableWindowViewModel viewModel) : base(true) |
40 |
{ |
41 |
InitializeComponent(); |
42 |
DataContext = _dataContext = viewModel; |
43 |
_dataContext.ReleaseNotesUpdater = this; |
44 |
_dataContext.UserRespondedHandler = this; |
45 |
ReleaseNotesBrowser.Navigated += ReleaseNotesBrowser_Navigated; |
46 |
} |
47 |
|
48 |
UpdateAvailableResult IUpdateAvailable.Result => _dataContext?.UserResponse ?? UpdateAvailableResult.None; |
49 |
|
50 |
AppCastItem IUpdateAvailable.CurrentItem => CurrentItem; |
51 |
|
52 |
public AppCastItem CurrentItem |
53 |
{ |
54 |
get { return _dataContext?.Updates?.FirstOrDefault(); } |
55 |
} |
56 |
|
57 |
public event UserRespondedToUpdate UserResponded; |
58 |
|
59 |
void IUpdateAvailable.BringToFront() |
60 |
{ |
61 |
BringToFront(); |
62 |
} |
63 |
|
64 |
void IUpdateAvailable.Close() |
65 |
{ |
66 |
ReleaseNotesBrowser.Navigated -= ReleaseNotesBrowser_Navigated; |
67 |
CloseWindow(); |
68 |
} |
69 |
|
70 |
void IUpdateAvailable.HideReleaseNotes() |
71 |
{ |
72 |
if (_dataContext != null) |
73 |
{ |
74 |
_dataContext.AreReleaseNotesVisible = false; |
75 |
} |
76 |
ReleaseNotesRow.Height = new GridLength(10); |
77 |
} |
78 |
|
79 |
void IUpdateAvailable.HideRemindMeLaterButton() |
80 |
{ |
81 |
if (_dataContext != null) |
82 |
{ |
83 |
_dataContext.IsRemindMeLaterVisible = false; |
84 |
} |
85 |
} |
86 |
|
87 |
void IUpdateAvailable.HideSkipButton() |
88 |
{ |
89 |
if (_dataContext != null) |
90 |
{ |
91 |
_dataContext.IsSkipVisible = false; |
92 |
} |
93 |
} |
94 |
|
95 |
void IUpdateAvailable.Show(bool isOnMainThread) |
96 |
{ |
97 |
ShowWindow(isOnMainThread); |
98 |
} |
99 |
|
100 |
public void UserRespondedToUpdateCheck(UpdateAvailableResult response) |
101 |
{ |
102 |
UserResponded?.Invoke(this, new UpdateResponseEventArgs(_dataContext?.UserResponse ?? UpdateAvailableResult.None, CurrentItem)); |
103 |
} |
104 |
|
105 |
// there is some bizarre thing where the WPF browser doesn't navigate to the release notes unless you successfully navigate to |
106 |
// about:blank first. I don't know why. I feel like this is a Terrible Bad Fix, but...it works for now... |
107 |
|
108 |
public void ShowReleaseNotes(string notes) |
109 |
{ |
110 |
_notes = notes; |
111 |
ReleaseNotesBrowser.Dispatcher.Invoke(() => |
112 |
{ |
113 |
|
114 |
if (ReleaseNotesBrowser.IsLoaded) |
115 |
{ |
116 |
if (_hasFinishedNavigatingToAboutBlank) |
117 |
{ |
118 |
ReleaseNotesBrowser.NavigateToString(_notes); |
119 |
} |
120 |
// else will catch up when navigating to about:blank is done |
121 |
} |
122 |
else |
123 |
{ |
124 |
// don't do anything until the web browser is loaded |
125 |
ReleaseNotesBrowser.Loaded += ReleaseNotesBrowser_Loaded; |
126 |
} |
127 |
}); |
128 |
} |
129 |
|
130 |
private void ReleaseNotesBrowser_Loaded(object sender, RoutedEventArgs e) |
131 |
{ |
132 |
// see https://stackoverflow.com/a/15209861/3938401 |
133 |
ReleaseNotesBrowser.Loaded -= ReleaseNotesBrowser_Loaded; |
134 |
ReleaseNotesBrowser.Dispatcher.Invoke(() => |
135 |
{ |
136 |
ReleaseNotesBrowser.NavigateToString("about:blank"); |
137 |
}); |
138 |
} |
139 |
|
140 |
private void ReleaseNotesBrowser_Navigated(object sender, NavigationEventArgs e) |
141 |
{ |
142 |
if (!_hasFinishedNavigatingToAboutBlank) |
143 |
{ |
144 |
ReleaseNotesBrowser.NavigateToString(_notes); |
145 |
_hasFinishedNavigatingToAboutBlank = true; |
146 |
} |
147 |
} |
148 |
} |
149 |
} |