Ich bin derzeit sehr durch das unterschiedliche Verhalten in Bezug auf die FrameworkElement.Loaded
Ereignis verwirrt. Ich habe eine kleine Beispielanwendung zusammengestellt, die dies demonstriert.Odd Loaded Verhalten in Markup gegen Code
XAML:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
Loaded="Window_Loaded">
<Grid>
<TabControl>
<TabItem Header="Tab 1" />
<TabItem Header="Tab 2" >
<WindowsFormsHost Name="formHost" Loaded="formHost_Loaded" />
</TabItem>
</TabControl>
</Grid>
</Window>
Code:
using System.Windows;
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
formHost.Loaded += delegate
{
MessageBox.Show("Delegate");
};
}
private void formHost_Loaded(object sender, RoutedEventArgs e)
{
MessageBox.Show("Markup");
}
}
}
Wie es ist, wenn ich die Anwendung ausführen ich zwei unmittelbare MessageBox
es - "Markup" und "Delegate". Wenn ich jedoch Loaded="formHost_Loaded"
aus dem WindowsFormsHost
entferne, bekomme ich beim Start auch keinen. Es macht natürlich Sinn, warum ich den "Markup" -Dialog nicht bekomme, aber warum entfernt das auch den "Delegate"? Ich könnte mir vorstellen, dass es mit der Reihenfolge zu tun hat, in der die Ereignisse genannt werden (Fenster gegen seine Kinder), aber ich habe es schwer, es herauszufinden.
Hinweis: Sie können den WindowsFormsHost durch andere Steuerelemente ersetzen, es sollte wirklich keine Rolle spielen - ich habe es nur für ein paar andere Tests verwendet.