Итак, я написал приложение WPF, которое показывает статус проекта, отличный от сервера сборки. Статус, предоставленный сервером, полезен для MainIcon приложения.
Я добавил 4 значка (красный, оранжевый, желтый, зеленый) в качестве ресурсов и использовал их с IMultiValueConverter, который определяет, какой значок должен быть set / used.
Проблема в том, что когда TaskbarIcon изменяется во время отладки, все работает, как задумано, и значок меняется правильно. Но когда я публикую sh приложение, значок переключается на значок по умолчанию и изменится на правый значок, только если я закреплю и откручу его с панели задач. После этого изменение работает нормально все время, только в начале программы мне нужно закрепить и открепить его. Я читал, что это может быть проблема / ошибка Windows, но я не уверен в этом. Есть ли способ решить эту проблему? Любой обходной путь?
* Редактировать
// This is a snippet from the converter class where the icon gets selected
public object Convert(object values, Type targetType, object parameter, CultureInfo culture)
{
MainMonitorWindowViewModel mainViewModel =
(MainMonitorWindowViewModel)((MainMonitorWindow)Application.Current.MainWindow)?.DataContext;
if (values is ObservableCollection<BuildServerProjekt> col)
{
int amountYellow = 0;
int amountOrange = 0;
//this is to determine whether yellow or orange dominates in the list
foreach (BuildServerProjekt buildServerProjekt in col)
{
switch (buildServerProjekt.Activity)
{
case "Wird gebaut" when buildServerProjekt.BuildStatus == "Failure":
amountOrange++;
break;
case "Wird gebaut":
amountYellow++;
break;
}
}
bool isBuilding = col.Any(x => x.Activity == "Wird gebaut");
bool isBroken = col.Any(x =>
(x.Status == "Fehlgeschlagen" || x.Status == "Ausnahme wurde ausgelöst") && x.Activity != "Wird gebaut");
bool isOK = col.Any(x => x.Status == "Erfolgreich");
if (isBroken)
{
if (mainViewModel == null)
{
return new BitmapImage(new Uri("pack://application:,,,/SPBSMonitor;Component/icons/red256.ico"));
}
// here I set the MainIcon (TaskBar icon)
mainViewModel.MainIcon = new BitmapImage(new Uri("pack://application:,,,/SPBSMonitor;Component/icons/red256.ico"));
return new BitmapImage(new Uri("pack://application:,,,/SPBSMonitor;Component/icons/red256.ico"));
}
[...]
Привязка в коде xaml (возврат из преобразователя) предназначена для сборки NotifyIcon http://www.hardcodet.net/wpf-notifyicon, которая является только важно для TrayIcon (который прекрасно работает при обновлении).
mainViewModel.MainIcon
- это свойство в моей ViewModel (MVVM), которое привязано к Window.Icon:
<Window x:Class="SP.BSMonitor.View.MainMonitorWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SP.BSMonitor"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:tb="http://www.hardcodet.net/taskbar"
xmlns:mvConverter="clr-namespace:SP.BSMonitor.MVConverter"
mc:Ignorable="d"
MouseDown="MainMonitorWindow_OnMouseDown"
Title="Build-Monitor" MinHeight="380" MinWidth="800" Height="380" Width="800"
Loaded="MainMonitorWindow_OnLoaded" Closing="MainMonitorWindow_OnClosing" Name="Hauptfenster" ShowInTaskbar="True" Icon="{Binding MainIcon}">