WPF:在运行时将Page w /功能添加到窗口中作为XAML

时间:2009-08-11 20:37:07

标签: wpf xaml

我创建了一个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内容?

3 个答案:

答案 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,但是这仍然没有让我选择添加逻辑背后的代码。