Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将void转换为ICommand_C#_Wpf - Fatal编程技术网

C# 无法将void转换为ICommand

C# 无法将void转换为ICommand,c#,wpf,C#,Wpf,我正在使用,实际上我正在尝试学习如何在最小化托盘中的窗口后显示它。因此,当用户双击图标时,窗口应再次出现。实际上,我已经创建了以下代码: private void MetroWindow_StateChanged(object sender, EventArgs e) { TaskbarIcon tbi = new TaskbarIcon(); tbi.DoubleClickCommand = Recover(tbi); switch (WindowState)

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

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类型


不可能以这种方式调用方法吗?为什么?

实际上,
DoubleClickCommand
是一种类型

您需要将其设置为
ICommand
的子类型,以便像以下那样编译:

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

您可以阅读有关中继命令的更多信息

这里是一个简单中继命令的代码,这是您所需要的

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;
}

我建议您通读WPF,尤其是MVVM和命令模式。如果您将其视为WinForms,那么您也可以使用WinForms。@nvoigt实际上我对WPF有点生疏,无法解决实际问题:
DoubleClickCommand
是一个
ICommand
。您正在调用
Recover
,它返回一个
void
,并试图将该void分配给某个对象(这是毫无意义的)。此外,为此,您创建了一个新的
TaskbarIcon
,它始终位于
MetroWindow\u StateChanged
函数的本地。它从未添加到UI中,因此您对它所做的一切都无关紧要。我不熟悉metro应用程序,因此我不确定如何从您的UI中获取您实际需要的
TaskbarIcon
。嗯,我不明白一件事,当我粘贴您的代码时,编译器在
RelayCommand
下划线并显示:
RelayCommand未找到。
我在intellisense中没有可用的功能,发生了什么事?可能您缺少名称空间
Microsoft.TeamFoundation.MVVM
,您需要包含名称空间的using语句,因为在中没有标准的语句WPF@DeanChalk好的,现在很清楚了,我认为,
RelayCommand
是一个c#类,谢谢你的好例子:)这是一门课@Dillinger@EhsanSajjad糟糕的解释,我的意思是这是一个c#特性,我们必须添加dll引用才能使用,它存在于我提到的名称空间中
tbi.DoubleClickCommand =new RelayCommand(_ => Recover(tbi));