【问题标题】:Cannot convert void to ICommand无法将 void 转换为 ICommand
【发布时间】:2016-05-11 15:05:06
【问题描述】:

我正在使用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

不能这样调用方法吗?为什么?

【问题讨论】:

  • 我建议您通读 WPF,尤其是 MVVM 和命令模式。如果你把它当成 WinForms,你也可以使用 WinForms。
  • @nvoigt 好吧,实际上我对 wpf 有点生疏了
  • 解决实际问题:DoubleClickCommandICommand。您正在调用 Recover ,它返回一个 void 并试图将该 void 分配给某些东西(这永远没有意义)。此外,为此,您创建了一个新的TaskbarIcon,它始终位于MetroWindow_StateChanged 函数的本地。它从未添加到 UI 中,因此您对它所做的一切都不重要。我不熟悉 Metro 应用程序,因此我不确定如何从您的 UI 中获取您实际需要的 TaskbarIcon

标签: c# wpf


【解决方案1】:

这是您需要的简单 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));

【讨论】:

  • 因为你没有在 WPF 中获得一个标准
  • @DeanChalk 好的,现在很清楚了,我认为 RelayCommand 是 c# 的一个类,谢谢你的好例子 :)
  • 这是一个类@Dillinger
  • @EhsanSajjad 解释不好,我的意思是 c# 功能
  • 我们必须在我提到的命名空间中添加要使用的 dll 引用
【解决方案2】:

实际上,DoubleClickCommand 的类型是 ICommand

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

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

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

【讨论】:

  • 嗯,我什么都不懂,当我粘贴你的代码时,编译器会在RelayCommand 下划线并显示:RelayCommand was not found. 我在智能感知中没有使用可用,发生了什么?跨度>
  • 可能您缺少命名空间Microsoft.TeamFoundation.MVVM
  • 你需要包含命名空间的 using 语句
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多