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