我在打开新窗口的视图模型中使用此方法:
public IEnumerable<IResult> OpenChatScreen()
{
if (!_activeChatScreens.ContainsKey(nick))
{
var chatScreen = new ShowWindow("ChatScreen")
.InitializeWith(_service.DetailData(nick));
_activeChatScreens.Add(nick, chatScreen);
yield return chatScreen;
}
}
此方法例如是按钮上的绑定。
我尝试在其他void方法中使用此方法。像这样:
public void SomeMethod(string nick)
{
OpenChatScreen(nick);
}
但它没有打开新窗口。有可能解决这个问题吗?我需要在其他方法typeof void中使用OpenChatScreen方法,如果有可能,我想打开新窗口。谢谢你的帮助。
to codekaizen:
我试试这个:
public void SomeMethod(string nick)
{
new IResult[] { OpenChatScreen(nick) };
}
我收到此错误:
*错误2无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'Caliburn.Micro.IResult'。存在显式转换(您是否缺少演员?)C:\ Users \ Jan \ Documents \ Visual Studio 2010 \ Projects \ C#\ Pokec_Messenger \ ver.beta \ Pokec__Messenger \ Spirit_Caliburn_Micro_v1.1 \ ViewModels \ MessengerViewModel.cs 314 45 Spirit_Caliburn_Micro_v1。 1 *
所以我尝试施展给IResult:
var w = OpenChatScreen(rp.Nick) as IResult;
new IResult[] { w };
错误:
*错误1只有赋值,调用,递增,递减和新对象表达式才能用作语句C:\ Users \ Jan \ Documents \ Visual Studio 2010 \ Projects \ C#\ Pokec_Messenger \ ver.beta \ Pokec__Messenger \ Spirit_Caliburn_Micro_v1.1 \ ViewModels \ MessengerViewModel.cs 314 29 Spirit_Caliburn_Micro_v1.1 *
我不知道如何在void方法中使用OpenChatScreen方法。
答案 0 :(得分:5)
它的协程。就其本身而言,它无法运行它。您需要执行使用Caliburn.Micro:Coroutine.Execute(OpenChatScreen().GetEnumerator())
此外,尝试在官方Caliburn.Micro论坛上搜索或询问: http://caliburnmicro.codeplex.com/Thread/View.aspx?ThreadId=231822
答案 1 :(得分:0)
您可以创建一个扩展方法来为所有返回IEnumerable的方法执行协同程序:
public static void AsCoroutine(this IEnumerable<IResult> routine, EventHandler<ResultCompletionEventArgs> callBack = null)
{
if (routine != null)
Coroutine.BeginExecute(routine.GetEnumerator(), null, callBack);
}
然后你可以使用这个方法:
XAML加价:
<UserControl>
<Menu Grid.Row="0">
<MenuItem Header="File">
<MenuItem Header="About" x:Name="ShowHome" />
</MenuItem>
</Menu>
</UserControl>
视图模型:
public void ShowHome()
{
ShowScreen(IoC.Get<IHome>()).AsCoroutine();
}
public IEnumerable<IResult> ShowScreen(object parameter)
{
if (parameter is RoutedEventArgs)
{
var menuItem = (FrameworkElement)((RoutedEventArgs)parameter).OriginalSource;
if (menuItem != null && menuItem.Tag != null)
yield return BusyResult.Start(() => GetScreen(menuItem.Tag.ToString()));
else yield break;
}
else if (parameter is IScreen)
{
ActivateItem((IScreen)parameter);
}
}