无法将void转换为ICommand

时间:2016-05-11 15:05:06

标签: c# wpf

我正在使用WPF NotifyIcon,实际上我正在尝试学习如何在托盘中最小化后显示窗口。因此,当用户双击图标时,窗口应该再次出现。其实我已经创建了这段代码:

private void MetroWindow_StateChanged(object sender, EventArgs e)
{
   TaskbarIcon tbi = new TaskbarIcon();
   tbi.DoubleClickCommand = Recover(tbi);

     switch (WindowState)
     {
         case WindowState.Minimized:
            Visibility = Visibility.Hidden;
            tbi.Visibility = Visibility.Visible;
            break;
     }
}

private void Recover(TaskbarIcon tbi)
{
    tbi.Visibility = Visibility.Hidden;
    Visibility = Visibility.Visible;
}

当我最小化窗口时,您如何看到托盘中的图标出现。这工作得很好。我已经宣布了这样的图标:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:Test.Utils.Resources.UIDictionary"
                xmlns:tb="http://www.hardcodet.net/taskbar">

<tb:TaskbarIcon x:Key="NotifyIcon"
              IconSource="/Utils/Images/Test.ico"
              ToolTipText="hello world" />

</ResourceDictionary>

现在问题出在这一行:tbi.DoubleClickCommand = Recover(tbi);我收到此错误:

  

无法在System.Windows.Input.ICommand

中转换类型void

以这种方式调用方法是不可能的?为什么呢?

2 个答案:

答案 0 :(得分:2)

以下是您需要的简单RelayCommand的代码

public class RelayCommand : ICommand
{
    private Action<object> action;
    public RelayCommand(Action<object> action)
    {
        this.action = action;
    }
    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        action(parameter);
    }

    public event EventHandler CanExecuteChanged;
}

然后,就像其他答案一样

tbi.DoubleClickCommand =new RelayCommand(_ => Recover(tbi));

答案 1 :(得分:1)

实际上,DoubleClickCommand的类型为ICommand

您需要将其设置为RelayCommand,这是ICommand的子类型,以便进行编译,如:

 tbi.DoubleClickCommand =new RelayCommand(param => Recover(tbi));

您可以阅读有关中继命令on this MSDN link

的更多信息