我以編程方式從 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 中創建了一些按鈕,并且需要在單擊該按鈕時出現在我加載表單的下一個代碼中。
uj5u.com熱心網友回復:
那么解決方案可以是管理自定義Form和事件。
我創建了一個簡單的測驗專案:
- FormMain:主表單,帶按鈕打開一個HostForm
- FormHost:帶有
ElementHostwpf 用戶控制元件將顯示的表單 - TestControl:顯示在螢屏上的 wpf 控制元件
ElementHost
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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/330486.html
