NetCore WPF - ожидание привязок команд ContextMenu - PullRequest
0 голосов
/ 19 марта 2020

Я сталкиваюсь с какой-то довольно уникальной проблемой связывания «таймингов», в которой я не уверен, как обойти.

Характеристики:

  • Язык: NetCore 3.1
  • Тип: WPF
  • Формат: MVVM

I ' m, используя http://www.hardcodet.net/wpf-notifyicon, чтобы помочь с обработкой иконки системной задачи и ее меню левой кнопкой мыши.

Я использую пример https://github.com/hardcodet/wpf-notifyicon/tree/master/Hardcodet.NotifyIcon.Wpf/Source/Windowless%20Sample в качестве руководства по настройке ресурсов словаря и тому подобное.

Таким образом, я связываюсь с помощью:

(SystemTrayResources.xaml)

<MenuItem Header="Start" Command="{Binding Path = StartCommand}"/>
<MenuItem Header="Pause" Command="{Binding Path = PauseCommand}" />
<MenuItem Header="Disconnect" Command="{Binding Path = StopCommand}" />

, который в данный момент выполняет ICommand в моей модели просмотра.

Проблема, с которой я столкнулся в том случае, если я просто выполняю обычный прогон, он не оценивает, сможет ли он отключить какой-либо из элементов, и ни одна из команд не работает, то же самое происходит, если я отлаживаю, без каких-либо остановок или проверок. Но когда я ставлю его на паузу, когда объект сделан и установлен, и углубляюсь в TaskbarIcon.CommandBindings, а затем продолжаю работать, он работает!

Так что что-то в этой привязке и при указании ее установки происходит "слишком быстро" это все, что я могу сказать. Я пытался сделать await через:

(SystemTrayService.cs)
public async void SetTaskBar(TaskbarIcon taskbar)
{
    await Task.Run(() =>
    {
        Taskbar = taskbar;
    });
}

И я использую инъекцию зависимости:

(App.xaml.cs)

private void ConfigureServices(IServiceCollection services)
{
  services.AddSingleton<ISystemTrayService>(icon => new SystemTrayService());
  ....
}

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    ISystemTrayService systemtray = ServiceLocator.Current.GetInstance<ISystemTrayService>();
    systemtray.SetTaskBar((TaskbarIcon) FindResource("SystemTray"));

    if (systemtray.Taskbar.CommandBindings == null)
    {
        throw new Exception("Data Context for taskbar menu not set!");
    }

    ...
}

Любая помощь будет оценена, так как я не вижу никакой ждать или событие, чтобы увидеть, когда данные были связаны

...