Значок приложения WPF корректно меняется только после закрепления и открепления на Windows -taskbar - PullRequest
0 голосов
/ 18 февраля 2020

Итак, я написал приложение 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}">
...