我正在尝试在运行时从XAML创建UI,类似于
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上,并在那里显示一个消息框,它就可以了。如果我有一个空的处理程序或没有处理程序,它没有。
我是否需要为某些事件设置一些明确的处理?如果是,那些,我该如何处理?
Upadate:正如建议的那样,我尝试将动态标记放入新应用的主页中,如下所示:
public MainPage()
{
InitializeComponent();
var dynamic = XamlReader.Load(xaml);
this.LayoutRoot.Children.Add(dynamic as UIElement);
}
其中xaml
是一个包含上述内容的字符串文字,其他一切都是VS2010向导离开它的方式。这样可行。但我看不出有效的区别是什么。
更新更新:这是一个红鲱鱼;不同的是环境。它适用于VS,但不适用于我在真实应用程序中使用的Silverlight ActiveX控件。
答案 0 :(得分:0)
您是否在根元素上定义了根命名空间?
<param name="initParams" value="xaml=<TextBox xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' Text='hi'/>" />
这里只是一个黑暗的镜头,但您是否尝试将动态创建的内容添加为静态“MainPage.xaml”网格的子项而不是RootVisual?
答案 1 :(得分:0)
检查主XAML文件中的IsEnabled="True"
属性,如果它设置为false
,则控件将无法编辑。