mirror of
https://github.com/ckaczor/WorldClockStatusWindow.git
synced 2026-01-14 10:00:12 -05:00
Compare commits
5 Commits
v2024.9.9
...
v2024.10.1
| Author | SHA1 | Date | |
|---|---|---|---|
| 4751ae476d | |||
| 6d4d33c82f | |||
| fe0b0895b4 | |||
| 978873a58a | |||
| 733a3de573 |
2
.github/workflows/main.yml
vendored
2
.github/workflows/main.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
dotnet-version: 8.0.x
|
||||
|
||||
- name: Publish Application
|
||||
run: dotnet publish WorldClockStatusWindow.csproj -c Release -o publish
|
||||
run: dotnet publish WorldClockStatusWindow.csproj -c Debug -o publish
|
||||
|
||||
- name: Create Velopack Release
|
||||
run: |
|
||||
|
||||
@@ -22,6 +22,9 @@
|
||||
<setting name="TimeZones" serializeAs="String">
|
||||
<value>[]</value>
|
||||
</setting>
|
||||
<setting name="CheckVersionAtStartup" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
</WorldClockStatusWindow.Properties.Settings>
|
||||
</userSettings>
|
||||
</configuration>
|
||||
@@ -1,16 +1,12 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using NuGet.Versioning;
|
||||
using Serilog;
|
||||
using System;
|
||||
using Velopack;
|
||||
using Velopack.Sources;
|
||||
|
||||
namespace WorldClockStatusWindow;
|
||||
|
||||
internal class Program
|
||||
{
|
||||
private static UpdateManager _updateManager;
|
||||
|
||||
[STAThread]
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
@@ -28,8 +24,4 @@ internal class Program
|
||||
|
||||
Log.Logger.Information("End");
|
||||
}
|
||||
|
||||
public static UpdateManager UpdateManager => _updateManager ??= new UpdateManager(new GithubSource("https://github.com/ckaczor/WorldClockStatusWindow", null, false));
|
||||
|
||||
public static string LocalVersion => (UpdateManager.CurrentVersion ?? new SemanticVersion(0, 0, 0)).ToString();
|
||||
}
|
||||
94
Properties/Resources.Designer.cs
generated
94
Properties/Resources.Designer.cs
generated
@@ -79,6 +79,15 @@ namespace WorldClockStatusWindow.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Checking for update....
|
||||
/// </summary>
|
||||
public static string CheckingForUpdate {
|
||||
get {
|
||||
return ResourceManager.GetString("CheckingForUpdate", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to _Check for Update.
|
||||
/// </summary>
|
||||
@@ -88,6 +97,24 @@ namespace WorldClockStatusWindow.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Check _Now.
|
||||
/// </summary>
|
||||
public static string checkVersionNowButton {
|
||||
get {
|
||||
return ResourceManager.GetString("checkVersionNowButton", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to _Check for a new version on startup.
|
||||
/// </summary>
|
||||
public static string checkVersionOnStartupCheckBox {
|
||||
get {
|
||||
return ResourceManager.GetString("checkVersionOnStartupCheckBox", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Close.
|
||||
/// </summary>
|
||||
@@ -97,6 +124,33 @@ namespace WorldClockStatusWindow.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Downloading update....
|
||||
/// </summary>
|
||||
public static string DownloadingUpdate {
|
||||
get {
|
||||
return ResourceManager.GetString("DownloadingUpdate", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Installing update....
|
||||
/// </summary>
|
||||
public static string InstallingUpdate {
|
||||
get {
|
||||
return ResourceManager.GetString("InstallingUpdate", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Loading....
|
||||
/// </summary>
|
||||
public static string Loading {
|
||||
get {
|
||||
return ResourceManager.GetString("Loading", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to About.
|
||||
/// </summary>
|
||||
@@ -115,6 +169,15 @@ namespace WorldClockStatusWindow.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Update.
|
||||
/// </summary>
|
||||
public static string optionCategoryUpdate {
|
||||
get {
|
||||
return ResourceManager.GetString("optionCategoryUpdate", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Settings.
|
||||
/// </summary>
|
||||
@@ -133,6 +196,37 @@ namespace WorldClockStatusWindow.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to You are already running the most recent version.
|
||||
///
|
||||
///No updates are available at this time..
|
||||
/// </summary>
|
||||
public static string UpdateCheckCurrent {
|
||||
get {
|
||||
return ResourceManager.GetString("UpdateCheckCurrent", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Version {1} of {0} is now available.
|
||||
///
|
||||
///Would you like to download and install it now?.
|
||||
/// </summary>
|
||||
public static string UpdateCheckNewVersion {
|
||||
get {
|
||||
return ResourceManager.GetString("UpdateCheckNewVersion", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to {0} Update.
|
||||
/// </summary>
|
||||
public static string UpdateCheckTitle {
|
||||
get {
|
||||
return ResourceManager.GetString("UpdateCheckTitle", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Version {0}.
|
||||
/// </summary>
|
||||
|
||||
@@ -145,4 +145,38 @@
|
||||
<data name="Version" xml:space="preserve">
|
||||
<value>Version {0}</value>
|
||||
</data>
|
||||
<data name="optionCategoryUpdate" xml:space="preserve">
|
||||
<value>Update</value>
|
||||
</data>
|
||||
<data name="checkVersionOnStartupCheckBox" xml:space="preserve">
|
||||
<value>_Check for a new version on startup</value>
|
||||
</data>
|
||||
<data name="checkVersionNowButton" xml:space="preserve">
|
||||
<value>Check _Now</value>
|
||||
</data>
|
||||
<data name="UpdateCheckTitle" xml:space="preserve">
|
||||
<value>{0} Update</value>
|
||||
</data>
|
||||
<data name="UpdateCheckCurrent" xml:space="preserve">
|
||||
<value>You are already running the most recent version.
|
||||
|
||||
No updates are available at this time.</value>
|
||||
</data>
|
||||
<data name="UpdateCheckNewVersion" xml:space="preserve">
|
||||
<value>Version {0} is now available.
|
||||
|
||||
Would you like to download and install it now?</value>
|
||||
</data>
|
||||
<data name="Loading" xml:space="preserve">
|
||||
<value>Loading...</value>
|
||||
</data>
|
||||
<data name="CheckingForUpdate" xml:space="preserve">
|
||||
<value>Checking for update...</value>
|
||||
</data>
|
||||
<data name="DownloadingUpdate" xml:space="preserve">
|
||||
<value>Downloading update...</value>
|
||||
</data>
|
||||
<data name="InstallingUpdate" xml:space="preserve">
|
||||
<value>Installing update...</value>
|
||||
</data>
|
||||
</root>
|
||||
12
Properties/Settings.Designer.cs
generated
12
Properties/Settings.Designer.cs
generated
@@ -70,5 +70,17 @@ namespace WorldClockStatusWindow.Properties {
|
||||
this["TimeZones"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("True")]
|
||||
public bool CheckVersionAtStartup {
|
||||
get {
|
||||
return ((bool)(this["CheckVersionAtStartup"]));
|
||||
}
|
||||
set {
|
||||
this["CheckVersionAtStartup"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,5 +14,8 @@
|
||||
<Setting Name="TimeZones" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">[]</Value>
|
||||
</Setting>
|
||||
<Setting Name="CheckVersionAtStartup" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -13,7 +13,7 @@
|
||||
<StackPanel windows:Spacing.Vertical="10">
|
||||
<TextBlock Text="{x:Static properties:Resources.ApplicationName}"
|
||||
FontWeight="Bold" />
|
||||
<TextBlock Text="{Binding Source={x:Static worldClockStatusWindow:Program.LocalVersion}, StringFormat={x:Static properties:Resources.Version}}"
|
||||
<TextBlock Text="{Binding Source={x:Static worldClockStatusWindow:UpdateCheck.LocalVersion}, StringFormat={x:Static properties:Resources.Version}}"
|
||||
Name="VersionLabel" />
|
||||
<TextBlock Text="Chris Kaczor" />
|
||||
</StackPanel>
|
||||
|
||||
22
SettingsWindow/UpdateSettingsPanel.xaml
Normal file
22
SettingsWindow/UpdateSettingsPanel.xaml
Normal file
@@ -0,0 +1,22 @@
|
||||
<windows:CategoryPanelBase x:Class="WorldClockStatusWindow.SettingsWindow.UpdateSettingsPanel"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:properties="clr-namespace:WorldClockStatusWindow.Properties"
|
||||
xmlns:windows="clr-namespace:ChrisKaczor.Wpf.Windows;assembly=ChrisKaczor.Wpf.Windows.CategoryWindow"
|
||||
xmlns:worldClockStatusWindow="clr-namespace:WorldClockStatusWindow"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="150"
|
||||
d:DesignWidth="250">
|
||||
<StackPanel windows:Spacing.Vertical="10">
|
||||
<CheckBox Content="{x:Static properties:Resources.checkVersionOnStartupCheckBox}"
|
||||
Name="CheckVersionOnStartupCheckBox"
|
||||
IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=CheckVersionAtStartup}"
|
||||
Click="OnSaveSettings" />
|
||||
<Button Content="{x:Static properties:Resources.checkVersionNowButton}"
|
||||
IsEnabled="{Binding Source={x:Static worldClockStatusWindow:UpdateCheck.IsInstalled}}"
|
||||
HorizontalAlignment="Left"
|
||||
Click="HandleCheckVersionNowButtonClick" />
|
||||
</StackPanel>
|
||||
</windows:CategoryPanelBase>
|
||||
38
SettingsWindow/UpdateSettingsPanel.xaml.cs
Normal file
38
SettingsWindow/UpdateSettingsPanel.xaml.cs
Normal file
@@ -0,0 +1,38 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using WorldClockStatusWindow.Properties;
|
||||
|
||||
namespace WorldClockStatusWindow.SettingsWindow;
|
||||
|
||||
public partial class UpdateSettingsPanel
|
||||
{
|
||||
public UpdateSettingsPanel()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public override string CategoryName => Properties.Resources.optionCategoryUpdate;
|
||||
|
||||
private async void HandleCheckVersionNowButtonClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var cursor = Cursor;
|
||||
|
||||
Cursor = Cursors.Wait;
|
||||
|
||||
await UpdateCheck.DisplayUpdateInformation(true);
|
||||
|
||||
Cursor = cursor;
|
||||
}
|
||||
|
||||
private void OnSaveSettings(object sender, RoutedEventArgs e)
|
||||
{
|
||||
SaveSettings();
|
||||
}
|
||||
|
||||
private void SaveSettings()
|
||||
{
|
||||
if (!HasLoaded) return;
|
||||
|
||||
Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
50
UpdateCheck.cs
Normal file
50
UpdateCheck.cs
Normal file
@@ -0,0 +1,50 @@
|
||||
using NuGet.Versioning;
|
||||
using Serilog;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using Velopack;
|
||||
using Velopack.Sources;
|
||||
|
||||
namespace WorldClockStatusWindow;
|
||||
|
||||
internal static class UpdateCheck
|
||||
{
|
||||
private static UpdateManager _updateManager;
|
||||
|
||||
public static UpdateManager UpdateManager => _updateManager ??= new UpdateManager(new GithubSource("https://github.com/ckaczor/WorldClockStatusWindow", null, false));
|
||||
|
||||
public static string LocalVersion => (UpdateManager.CurrentVersion ?? new SemanticVersion(0, 0, 0)).ToString();
|
||||
|
||||
public static bool IsInstalled => UpdateManager.IsInstalled;
|
||||
|
||||
public static async Task DisplayUpdateInformation(bool showIfCurrent)
|
||||
{
|
||||
var newVersion = IsInstalled ? await UpdateManager.CheckForUpdatesAsync() : null;
|
||||
|
||||
if (newVersion != null)
|
||||
{
|
||||
var updateCheckTitle = string.Format(Properties.Resources.UpdateCheckTitle, Properties.Resources.ApplicationName);
|
||||
|
||||
var updateCheckMessage = string.Format(Properties.Resources.UpdateCheckNewVersion, newVersion.TargetFullRelease.Version);
|
||||
|
||||
if (MessageBox.Show(updateCheckMessage, updateCheckTitle, MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
|
||||
return;
|
||||
|
||||
Log.Logger.Information("Downloading update");
|
||||
|
||||
await UpdateManager.DownloadUpdatesAsync(newVersion);
|
||||
|
||||
Log.Logger.Information("Installing update");
|
||||
|
||||
UpdateManager.ApplyUpdatesAndRestart(newVersion);
|
||||
}
|
||||
else if (showIfCurrent)
|
||||
{
|
||||
var updateCheckTitle = string.Format(Properties.Resources.UpdateCheckTitle, Properties.Resources.ApplicationName);
|
||||
|
||||
var updateCheckMessage = string.Format(Properties.Resources.UpdateCheckCurrent, Properties.Resources.ApplicationName);
|
||||
|
||||
MessageBox.Show(updateCheckMessage, updateCheckTitle, MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
using ChrisKaczor.Wpf.Windows.FloatingStatusWindow;
|
||||
using ChrisKaczor.Wpf.Windows;
|
||||
using ChrisKaczor.Wpf.Windows.FloatingStatusWindow;
|
||||
using Serilog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
using System.Threading.Tasks;
|
||||
using System.Timers;
|
||||
using System.Windows.Threading;
|
||||
using ChrisKaczor.Wpf.Windows;
|
||||
using WorldClockStatusWindow.Properties;
|
||||
using WorldClockStatusWindow.SettingsWindow;
|
||||
|
||||
namespace WorldClockStatusWindow;
|
||||
@@ -25,7 +25,7 @@ internal class WindowSource : IWindowSource, IDisposable
|
||||
internal WindowSource()
|
||||
{
|
||||
_floatingStatusWindow = new FloatingStatusWindow(this);
|
||||
_floatingStatusWindow.SetText("Loading...");
|
||||
_floatingStatusWindow.SetText(Resources.Loading);
|
||||
|
||||
_dispatcher = Dispatcher.CurrentDispatcher;
|
||||
|
||||
@@ -38,29 +38,32 @@ internal class WindowSource : IWindowSource, IDisposable
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!Program.UpdateManager.IsInstalled)
|
||||
if (!UpdateCheck.IsInstalled)
|
||||
return false;
|
||||
|
||||
if (!Settings.Default.CheckVersionAtStartup)
|
||||
return false;
|
||||
|
||||
Log.Logger.Information("Checking for update");
|
||||
|
||||
await _dispatcher.InvokeAsync(() => _floatingStatusWindow.SetText("Checking for update..."));
|
||||
await _dispatcher.InvokeAsync(() => _floatingStatusWindow.SetText(Resources.CheckingForUpdate));
|
||||
|
||||
var newVersion = await Program.UpdateManager.CheckForUpdatesAsync();
|
||||
var newVersion = await UpdateCheck.UpdateManager.CheckForUpdatesAsync();
|
||||
|
||||
if (newVersion == null)
|
||||
return false;
|
||||
|
||||
Log.Logger.Information("Downloading update");
|
||||
|
||||
await _dispatcher.InvokeAsync(() => _floatingStatusWindow.SetText("Downloading update..."));
|
||||
await _dispatcher.InvokeAsync(() => _floatingStatusWindow.SetText(Resources.DownloadingUpdate));
|
||||
|
||||
await Program.UpdateManager.DownloadUpdatesAsync(newVersion);
|
||||
await UpdateCheck.UpdateManager.DownloadUpdatesAsync(newVersion);
|
||||
|
||||
Log.Logger.Information("Installing update");
|
||||
|
||||
await _dispatcher.InvokeAsync(() => _floatingStatusWindow.SetText("Installing update..."));
|
||||
await _dispatcher.InvokeAsync(() => _floatingStatusWindow.SetText(Resources.InstallingUpdate));
|
||||
|
||||
Program.UpdateManager.ApplyUpdatesAndRestart(newVersion);
|
||||
UpdateCheck.UpdateManager.ApplyUpdatesAndRestart(newVersion);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -89,7 +92,7 @@ internal class WindowSource : IWindowSource, IDisposable
|
||||
|
||||
private void Load()
|
||||
{
|
||||
_timeZoneEntries = JsonSerializer.Deserialize<List<TimeZoneEntry>>(Properties.Settings.Default.TimeZones);
|
||||
_timeZoneEntries = JsonSerializer.Deserialize<List<TimeZoneEntry>>(Settings.Default.TimeZones);
|
||||
|
||||
if (_timeZoneEntries.Any())
|
||||
return;
|
||||
@@ -104,8 +107,8 @@ internal class WindowSource : IWindowSource, IDisposable
|
||||
|
||||
private void Save()
|
||||
{
|
||||
Properties.Settings.Default.TimeZones = JsonSerializer.Serialize(_timeZoneEntries);
|
||||
Properties.Settings.Default.Save();
|
||||
Settings.Default.TimeZones = JsonSerializer.Serialize(_timeZoneEntries);
|
||||
Settings.Default.Save();
|
||||
}
|
||||
|
||||
private void HandleTimerElapsed(object sender, ElapsedEventArgs e)
|
||||
@@ -123,7 +126,7 @@ internal class WindowSource : IWindowSource, IDisposable
|
||||
if (text.Length > 0)
|
||||
text.AppendLine();
|
||||
|
||||
text.Append($"{timeZoneEntry.Label.PadLeft(labelLength)}: {TimeZoneInfo.ConvertTime(now, timeZone).ToString(Properties.Settings.Default.TimeFormat)}");
|
||||
text.Append($"{timeZoneEntry.Label.PadLeft(labelLength)}: {TimeZoneInfo.ConvertTime(now, timeZone).ToString(Settings.Default.TimeFormat)}");
|
||||
}
|
||||
|
||||
_dispatcher.Invoke(() => _floatingStatusWindow.SetText(text.ToString()));
|
||||
@@ -140,9 +143,9 @@ internal class WindowSource : IWindowSource, IDisposable
|
||||
|
||||
public Guid Id => Guid.Parse("29DF6CFD-6783-406F-AE12-4723EB7741EA");
|
||||
|
||||
public string Name => "World Clock";
|
||||
public string Name => Resources.ApplicationName;
|
||||
|
||||
public System.Drawing.Icon Icon => Properties.Resources.ApplicationIcon;
|
||||
public System.Drawing.Icon Icon => Resources.ApplicationIcon;
|
||||
|
||||
public bool HasSettingsMenu => true;
|
||||
|
||||
@@ -150,7 +153,6 @@ internal class WindowSource : IWindowSource, IDisposable
|
||||
|
||||
public void ShowAbout()
|
||||
{
|
||||
_floatingStatusWindow.SetText(Assembly.GetEntryAssembly()!.GetName().Version!.ToString());
|
||||
}
|
||||
|
||||
public void ShowSettings()
|
||||
@@ -158,10 +160,11 @@ internal class WindowSource : IWindowSource, IDisposable
|
||||
var categoryPanels = new List<CategoryPanelBase>
|
||||
{
|
||||
new GeneralSettingsPanel(),
|
||||
new UpdateSettingsPanel(),
|
||||
new AboutSettingsPanel()
|
||||
};
|
||||
|
||||
var settingsWindow = new CategoryWindow(categoryPanels, Properties.Resources.SettingsTitle, Properties.Resources.CloseButtonText);
|
||||
var settingsWindow = new CategoryWindow(categoryPanels, Resources.SettingsTitle, Resources.CloseButtonText);
|
||||
|
||||
var dialogResult = settingsWindow.ShowDialog();
|
||||
|
||||
@@ -179,11 +182,11 @@ internal class WindowSource : IWindowSource, IDisposable
|
||||
|
||||
public string WindowSettings
|
||||
{
|
||||
get => Properties.Settings.Default.WindowSettings;
|
||||
get => Settings.Default.WindowSettings;
|
||||
set
|
||||
{
|
||||
Properties.Settings.Default.WindowSettings = value;
|
||||
Properties.Settings.Default.Save();
|
||||
Settings.Default.WindowSettings = value;
|
||||
Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
}
|
||||
2
WorldClockStatusWindow.sln.DotSettings
Normal file
2
WorldClockStatusWindow.sln.DotSettings
Normal file
@@ -0,0 +1,2 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Kaczor/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||
Reference in New Issue
Block a user