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

本文关键字:WPF 窗口 应用程序 另一个 | 更新日期: 2023-09-27 17:49:27

如何从另一个应用程序调用WPF窗口?我想有一个UI.Resources项目与所有的窗口,视图模型,我称之为"序列"(标准类来控制窗口流)。最后,我将为我想要调用的UI进程(Login, GetLocale等)调用适当的序列。"sequence"类随后将创建所有资源,并处理显示和隐藏正确的窗口以完成任务。不幸的是,在下面的示例中,期望的窗口从未显示。应用程序只是挂在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;
    }
}

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

我刚刚做了一些非常相似的事情。我想分享一下我的有效方法。方法如下。我们将在XAML中使用System.Windows.Control.DockPanel。dock面板可以动态加载不同的"用户控件"。用户控件非常类似于表单,我们可以在表单上创建UI元素。在您的示例中,您想要显示的对话内容在这里。

步骤1

将DockPanel放置在一个网格中

<DockPanel x:Name="mainDockPanel">          
</DockPanel>
步骤2

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

确保新添加的用户控件的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;
            }