我在WPF项目中使用 XamlReader 。它有效(My reference)
我目前的样本Xaml是这样的:
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Width="800" Height="600">
<Button Name="Test1" Content="Test1" Width="357" Height="88" Margin="14,417,0,0" ></Button>
<Button Name="Test2" Content="Test2" Width="357" Height="88" Margin="14,529,0,0" ></Button>
</Grid>
并添加按钮的点击事件,如下所示:
button = LogicalTreeHelper.FindLogicalNode(rootObject, "Test1") as Button ;
button.Click += new RoutedEventHandler(Button1_Click);
是否可以像这样编写xaml?
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Width="800" Height="600">
<Button Name="Test1" Content="Test1" ... Click="Button1_Click"></Button>
<Button Name="Test2" Content="Test2" ... Click="Button2_Click"></Button>
</Grid>
答案 0 :(得分:1)
XamlReader.Load
不允许在其中附加eventHandlers
。所以使用这种技术动态地将eventHandlers
附加到它。
1-编写没有eventHandlers
的Xaml字符串 - 但是写下这些控件的Name属性。
2-用XamlReader.Load(str);
3-然后从中加载DataTemplate的内容。使用Grid template = ((Grid)(dt.LoadContent()));
注意:此处Grid
是DataTemplate
中的父控件。
4-找到要附加事件处理程序的名称控件。
Button img = (Button)template.FindName("MyButtonInDataTemplate");
我希望它有所帮助。
答案 1 :(得分:0)
没有。您无法使用原始XAML在运行时保存事件或加载它们。这是XAML序列化的限制,因为序列化XAML是自包含的,意味着每个资源都应该在原始XAML中加载而事件的代码逻辑不是。阅读更多here