当从Windows.forms打开时如何关闭用户控件wpf



我从Windows调用了一个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中创建了一些按钮,并且需要在点击该按钮到下一个加载表单的代码时显示出来。

解决方案可以是管理自定义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

最新更新