Я пытаюсь создать пользовательский интерфейс из XAML во время выполнения, с чем-то вроде
private void Application_Startup (object esender, StartupEventArgs e)
{
this.RootVisual = (UIElement)(XmlReader.Load(e.InitParams["Xaml"])
Если я передаю ему этот XAML:
<Canvas
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sdk="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls">
<StackPanel>
<TextBox Width="120" Margin="8" Text="Edit Me" />
<CheckBox Margin="8">Normal</CheckBox>
<ComboBox Margin="8" Width="120" SelectedIndex="1">
<ComboBoxItem Content="First Normal Item" />
<ComboBoxItem Content="Second Normal Item" />
</ComboBox>
</StackPanel>
</Canvas>
, тогда флажок и список ведут себя какожидается, но мой TextBox не отвечает на набор текста, он остается с его начальным значением.Действительно странная (для меня) часть заключается в том, что, если я помещаю обработчик для KeyDown в RootVisual, и там отображается окно сообщения, это работает.Если у меня есть пустой обработчик или нет обработчика, это не так.
Нужно ли настроить явную обработку некоторых событий?Если да, то какие и как с ними справляться?
Обновление: как было предложено, я попытался поместить динамическую разметку в главную страницу нового приложения, например:
public MainPage()
{
InitializeComponent();
var dynamic = XamlReader.Load(xaml);
this.LayoutRoot.Children.Add(dynamic as UIElement);
}
где xaml
- строковый литерал, содержащий содержимое, как указано выше, а все остальное - это то, как его оставил мастер VS2010.Это работает.Но я не вижу, какова эффективная разница.
Обновление обновления: это красная сельдь;Разница заключается в окружающей среде.Он работает в VS, но не в элементе управления Silverlight ActiveX, который я использую в реальном приложении.