【问题标题】:How do close the User control wpf when opened from a Windows.forms从 Windows.forms 打开时如何关闭用户控件 wpf
【发布时间】:2021-11-17 17:14:16
【问题描述】:

我以编程方式从 Windows.Forms 调用了 WPF 表单。现在这里的问题是我需要在单击 wpf 表单内的按钮时关闭 wpf 表单,但它没有发生并且只停留在 WPF 屏幕中。知道我们如何关闭 wpf 表单并继续执行进一步的步骤。

   Form dialog = new Form();
                    dialog.Width = 200;
                    dialog.Height = 100;

ctrlHost = new ElementHost();
                    ctrlHost.Dock = DockStyle.Fill;
                    prompt.Controls.Add(ctrlHost); 
                    wpfControl = new User_Control();
                    wpfControl.InitializeComponent();
                    ctrlHost.Child = wpfControl;

                    wpfControl.dialogResult = dialog.ShowDialog();

如果您看到我上面的代码,我已经在运行时创建了表单并将 wpf 分配给它。但是在showdialog之后,我被那个屏幕击中并且无法出来。所以需要一个代码来关闭 wpf 并退出该表单。

知道我们如何从 wpf 中出来。因为我在 WPF 中创建了一些按钮,并且需要在单击该按钮时出现在我加载表单的下一个代码中。

【问题讨论】:

  • 你好,你能告诉我们WPF用户控件的代码吗?
  • 这是一个基本的 wpf 屏幕,里面没有写太多逻辑。试图了解当我单击按钮时必须编写什么逻辑,以便关闭 wpf 表单。 private void btn_Click(object sender, RoutedEventArgs e) { //窗口 parentwin = Window.GetWindow(this); //parentwin.Close(); }

标签: c# wpf


【解决方案1】:

一个解决方案可以是管理一个自定义Form 和一个事件。

我创建了一个简单的测试项目:

  1. FormMain:主窗体,带有打开 HostForm 的按钮
  2. FormHost:带有ElementHost 的表单,wpf 用户控件将在其中显示
  3. TestControl:在ElementHost 上显示的 wpf 控件

FormMain 的代码

 public partial class FormMain : Form
 {
        public FormMain()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var dialog = new FormHost();
            dialog.Width = 200;
            dialog.Height = 100;

            var result = dialog.ShowDialog();

        }   
 }

你有没有看到我刚刚调用了 FormHost 并等待它的结果

FormHost 代码:

 public partial class FormHost : Form
{
    public FormHost()
    {
        InitializeComponent();

        elementHost1.Dock = DockStyle.Fill;
        var wpfControl = new TestControl();
        wpfControl.InitializeComponent();

        //Code your events management here 
        wpfControl.Close += WpfControl_Close; 
        
        elementHost1.Child = wpfControl;

    }

    private void WpfControl_Close(DialogResult result)
    {
        //Manage the result as you like 
        DialogResult = result;
        Close();
    }    
}

在 FormHost 中,我管理了 WPF 控件的初始化以及事件的管理。

TestControl 的 Xaml 代码

<UserControl x:Class="TestHost.TestControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:TestHost"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
    <Button Content="Ok" Width="60" VerticalAlignment="Center"  HorizontalAlignment="Center" Click="Ok_Click" Margin="10"/>
    <Button Content="Cancel" Width="60" VerticalAlignment="Center"  HorizontalAlignment="Center"   Margin="10" Click="Cancel_Click"/>
</StackPanel>

TestControl 背后的代码:

 public partial class TestControl : System.Windows.Controls.UserControl
{
    public event Action<DialogResult> Close;

    public TestControl()
    {
        InitializeComponent();
    }

    private void Ok_Click(object sender, RoutedEventArgs e)
    {
        Close?.Invoke(DialogResult.OK);
    }

    private void Cancel_Click(object sender, RoutedEventArgs e)
    {
        Close?.Invoke(DialogResult.Cancel);
    }
}

如您所见,我在 ElementHost 的父窗体上创建了一个事件并进行了管理,而不是我关闭了 FormHost 并设置了它的 DialogResult

【讨论】:

  • 无法在“this”参数中获得“关闭”选项
  • 这是 WPF 用户控件
  • 对不起,我误解了你的问题,让我修正一下答案
  • @Developer 我已经更新了答案,如果你需要我也可以把我测试过的解决方案发给你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 2015-12-28
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多