一个解决方案可以是管理一个自定义Form 和一个事件。
我创建了一个简单的测试项目:
- FormMain:主窗体,带有打开 HostForm 的按钮
- FormHost:带有
ElementHost 的表单,wpf 用户控件将在其中显示
- 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。