我创建了一个WPF应用程序,我使用c#代码动态构建XAML元素,然后将它们添加到根“容器”网格中。
我正在尝试的是利用Blend中的功能并创建一些XAML页面,这些页面在逻辑,故事板等背后有自己的代码集。
我想在运行时加载那个XAML,但由于某些原因我的方法不起作用,我为什么不知所措。
这就是我之前所做的。在我的根窗口中,我创建了一个新的MyModule并将其添加到我的contentRoot。
myModule = new MyModule();
contentRoot.Children.Add(myModule );
(可行的方法)MyModule类扩展了Canvas,包含.XAML文件和.CS代码隐藏文件。 XAML只是一个根画布,而.CS具有创建元素并将它们添加到根画布的所有逻辑。
当我使用同样的方法时MyModule现在扩展页面没有显示任何内容。 XAML现在有很多内容,包括Canvas.Resources Canvas.Triggers和一堆其他元素。
如何在运行时从包含逻辑背后的代码的类中加载预先创建的XAML内容?
答案 0 :(得分:4)
Page和Canvas是XAML中两种不同的组件。
Page是框架元素,Canvas是Container,可以使用绝对x,y坐标放置多个控件。其他页面只有一个属性“内容”,您可以将页面视为高级内容控件。
Blend必须创建与Canvas相关的方法,它们将类似于“Canvas.SetLeft”等,但它们肯定不适用于Page。
您的Page类必须有一个“Canvas”类型的内容,您必须在页面内的“Canvas”中添加所有控件,这对您有所帮助。
这是MSDN的文字,
一个页面只能有一个子元素。页面上的所有其他元素必须是该元素的后代。通常,页面的内容托管一个布局元素,例如Grid,StackPanel和DockPanel,它们托管页面的内容。
在您的情况下,Page应该托管一个元素“Canvas”并添加项目。
或者为什么不尝试这个,让你的MyModule与它的相同,然后你创建一个名为MyModulePage的新页面,它应该是这样的。
<MyModulePage>
<MyModule/> <!-- that is your canvas generated in blend -->
</MyModulePage>
答案 1 :(得分:3)
我发现这个问题有点不清楚,但这里有一些对我有用的东西。
将MyModule定义为:
<Page x:Class="WpfApplication3.MyModule"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
</Page>
public partial class MyModule : Page
{
public MyModule()
{
InitializeComponent();
this.Content = new TextBlock(new Run("WOW!"));
}
}
创建了一个名为MyModuleStandalone.xaml的独立文件:
<local:MyModule xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:WpfApplication3;assembly=WpfApplication3"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</local:MyModule>
以下代码有效。当我显示c时,它会显示一个文本块,文本为“WOW!”。
FileStream xamlFile = new FileStream("MyModuleStandalone.xaml", FileMode.Open, FileAccess.Read);
MyModule c= (MyModule)XamlReader.Load(xamlFile);
this.Content = c;
本地var c是MyModule的一个实例,因此该类的所有代码都可用。这是你在找什么?
您不能在独立XAML文件中使用x:Class属性,因为这意味着XAML是一个部分类,而其他类在其他地方声明。 XamlReader不支持它。
请记住,当您阅读XAML文件时,您读取序列化对象。无法动态地将代码注入任意独立的xaml文件。
答案 2 :(得分:0)
FileStream xamlFile = new FileStream("Resources/News/NewsModuleCanvas.xaml", FileMode.Open, FileAccess.Read);
Canvas newsCanvas = (Canvas)XamlReader.Load(xamlFile);
contentRoot.Children.Add(newsCanvas);
用它来加载XAML,但是这仍然没有让我选择添加逻辑背后的代码。