如何从另一个应用程序打开WPF窗口

时间:2014-03-10 20:28:41

标签: c# wpf

如何从其他应用程序调用WPF窗口?我希望有一个UI.Resources项目,包含所有窗口,视图模型,以及我称之为“序列”(控制窗口流程的标准类)。最后,我会调用我想要调用的UI进程的正确序列(LoginGetLocale等)。然后,“序列”类将创建所有资源,并处理显示和隐藏正确的Windows以完成任务。不幸的是,在下面的示例中,所需的窗口永远不会显示。该应用只会挂在ShowDialog()来电:

public static bool Process(ClientLibrary client,
                   out Country country, out State state, out City city,
                   out string errorMessage)
{
    country = null;
    state = null;
    city = null;
    errorMessage = null;

    try
    {
        if (client == null) { errorMessage = "Internal Error: Client not supplied"; }

        var model = new LocaleSelectHeirarchyViewModel(client);
        var window = new LocaleSelectHeirarchyWindow(model);

        var result = window.ShowDialog();
        window.Close();
        window = null;

        if (result == null || !result.Value || model.SelectedCity == null)
        {
            return false;
        }

        country = model.SelectedCountry;
        state = model.SelectedState;
        city = model.SelectedCity;

        return true;
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);

        errorMessage = "Internal Error: Client threw an exception";

        return false;
    }
}

1 个答案:

答案 0 :(得分:1)

我做了一件非常相似的事情。我想分享一下有效的方法。 这是方法。 我们将在XAML中使用System.Windows.Control.DockPanel。停靠面板可以动态加载不同的“用户控件”。用户控件与表单非常相似,我们可以在表单上创建UI元素。在您的情况下,您要显示的对话内容将在此处显示。

第1步

将此DockPanel放在网格中。

<DockPanel x:Name="mainDockPanel">          
</DockPanel>

第2步

下一步是创建不同的用户控件。 右键单击visual studio中的WPF项目 - &gt;添加新用户控件

确保新添加的用户控件的xaml.cs代码具有此

public partial class myUserControlUC : UserControl

基本上它应该来自System.Windows.Controls.UserControl 使用用户控件的XAML,我们可以创建我们需要的任何花哨的UI。

第3步

现在一切准备就绪,我们只需要打电话

mainDockPanel.Children.Add(new myUserControlUC());

这可以放在开关内,以在不同条件下显示不同的东西 例如

mainDockPanel.Children.Clear();
            switch (i)
            {
                case 1:                    
                    mainDockPanel.Children.Add(new ToolKitUC1());
                    break;
                case 2:                    
                    mainDockPanel.Children.Add(new ToolKitUC2());
                    break;
                case 3:                    
                    mainDockPanel.Children.Add(new ToolKitUC3());
                    break;
            }