我使用
从Winform Project运行WPF项目 Dim frm2 As New EspBtpWpf.MainWindow("TableauBord", gEnv)
Integration.ElementHost.EnableModelessKeyboardInterop(frm2)
frm2.Show()
在我的WPF项目中,我有一个主窗口(MainWindow)和一个用户控件(ucTableauBord)。 我的MainWindow将ucTableauBord初始化为他的一个Frame。
public partial class MainWindow : Window {
public MainWindow(string pMode, SqiD23.Env pEnv=null) {
Classes.clsGlobal.EnsureApplicationResources(); // Lier le dictionnary aux ressources si on ne passe pas par le point d'entrée de l'application.
...
LoadInterface(pMode);
}
public MainWindow() :this("TableauBord") {
}
private void LoadInterface(string pMode) {
if (pMode=="TableauBord") {
navigateMain(new ucTableauBord());
} else
navigateMain(new ucBudgetDetaille());
}
/// <summary>Charge le userControl P dans le corps de la page principale.</summary>
/// <param name="p">Instance du UserControl (new MyUserControl()).</param>
public void navigateMain(UserControl p) {
if ((frmMain.Content == null) || (frmMain.Content.ToString() != p.ToString()))
frmMain.Content = p; // */
}
}
和UserControl:
public partial class ucTableauBord : ucTemplate {
public ucTableauBord() {
InitializeComponent();
Load();
}
private void Load() {
...
foreach (Window window in Application.Current.Windows.OfType<MainWindow>()) { // Retourne 0 car il ne voit que ucTableauBord lors du premier appel
WinMain = (MainWindow)window;
}
if (WinMain != null) SetMsgMain("OK Load.");
}
}
我的问题是我需要从ucTableauBord访问MainWindow。 但是,在第一次加载时,Application.Current.Windows不包含MainWindows,而是包含Microsoft.XamlDiagnostics.WpfTap.WpfVisualTreeService.Adorners.AdornerLayerWindow元素。 如果我关闭WPF窗口(没有关闭WinForm项目,并且我再次加载WPF项目,Application.Current.Windows包含所需的MainWindow。 它很奇怪,但如果我直接运行我的WPF项目,Application.Current.Windows总是包含所需的MainWindow。
为什么首次运行WPF项目会破坏Application.Current.Windows?
此致
答案 0 :(得分:0)
我不确定我是否完全理解你要在这里做什么,但如果你想获得UserControl的父窗口的引用,你可以在加载UserControl后调用Window.GetWindow方法:
public partial class ucTableauBord : ucTemplate
{
public ucTableauBord()
{
InitializeComponent();
this.Loaded += Load();
}
private void Load(object sender, RoutedEventArgs e)
{
MainWindow win = Window.GetWindow(this) as MainWindow;
//...
}
}
答案 1 :(得分:0)
您可以将MainForm
引用传递给用户控件,以便以后保存。这通常在构造函数中完成,但在创建属性后立即设置属性通常也是可以接受的。
在主表格上:
navigateMain(new ucTableauBord(this));
在用户控件上:
public partial class ucTableauBord : ucTemplate {
public ucTableauBord(MainForm mainForm) {
InitializeComponent();
_mainForm = mainForm;
Load();
}
private void Load() {
...
//foreach (Window window in Application.Current.Windows.OfType<MainWindow>()) { // Retourne 0 car il ne voit que ucTableauBord lors du premier appel
WinMain = (MainWindow)window;
//}
//if (WinMain != null) SetMsgMain("OK Load.");
_mainForm.DoSomething();
}
private MainForm _mainForm;
}
为了让Visual Studio设计师满意,您可能需要添加一个名为InitializeComponent
的“默认”无参数构造函数。