2

我在打开新窗口时在视图模型中使用此方法:

    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 方法,如果可能的话,我想打开新窗口。感谢您的帮助。

代码改善:

我试试这个:

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 方法。

4

2 回答 2

5

Its Coroutine. In itself, its not possible to run it. You need to execute is using Caliburn.Micro : Coroutine.Execute(OpenChatScreen().GetEnumerator())

Also, try searching or asking on official Caliburn.Micro forum: http://caliburnmicro.codeplex.com/Thread/View.aspx?ThreadId=231822

于 2011-01-01T12:55:40.233 回答
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);
        }
    }
于 2012-05-22T21:42:40.313 回答