WPF:加载XAML文件,其中包含x:Code元素

时间:2012-12-06 16:15:08

标签: c# .net wpf xaml

我需要加载,并使用XAML文件。

我写过简单的XAML文件:

<Window      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="150" d:DesignWidth="300" Title="My Window">
    <x:Code>
        <![CDATA[
            void btnMyButton_Click_1(object sender, RoutedEventArgs e) {
                MessageBox.Show("Hello world", "Message", MessageBoxButton.OK, MessageBoxImage.Information);
            }
        ]]>
    </x:Code>
    <Grid>
        <Button x:Name="btnMyButton" x:FieldModifier="public" Margin="10" Padding="10" 
                FontSize="20" Click="btnMyButton_Click_1">My button</Button>
    </Grid>
</Window>

然后我尝试在我的代码中加载这个XAML:

String curDir = io.Path.GetDirectoryName(typeof(Lisp_Wpf.Commands).Assembly.Location);
String xamlFileName = "MyWindow.xaml";
String fileFullName = io.Path.Combine(curDir, xamlFileName);
DependencyObject depObj = default(DependencyObject);
using (io.FileStream fs = new io.FileStream(fileFullName, io.FileMode.Open)) {
    depObj = XamlReader.Load(fs) as DependencyObject;
    fs.Close();
}
if (depObj != null && depObj is Window) {
    Window win = (Window)depObj;
    acad.ShowModalWindow(win);
}

但我得到例外:

  发生了System.Windows.Markup.XamlParseException:'无法创建   '无法在文字'btnMyButton_Click_1'中创建'点击'。'线   数字'16'和行位置'31'。

我找到了这样的信息here

  

在x中声明的代码:WPF的代码有几个明显的限制:     ...     x:必须在父根元素上提供类指令。     ...

但如果我在Window元素中添加x:Class属性:

x:Class="Lisp_Wpf.MainWindow"

然后我得到例外:

  

'指定的类名'Lisp_Wpf.MainWindow'与实际的根实例类型不匹配   'System.Windows.Window'。删除Class指令或通过提供实例   XamlObjectWriterSettings.RootObjectInstance“。行号“1”和行位置“14”。

在我的MS Visual Studio项目中,XML文件具有以下属性: 构建动作=无; 复制到输出目录=始终复制; 自定义工具=(空字符串);

我删除了此XAML的部分CS文件。

2 个答案:

答案 0 :(得分:3)

如果你想在运行时加载xaml你就不能在你的XAML文件后面添加任何代码。可能你只需附加按钮点击的常规事件并在运行时识别控件 - 只需查看下面的链接并试一试即可

Loading XAML XML through runtime?

答案 1 :(得分:2)

一般提示(我没有重现您的具体问题):

在WPF中,如果Visual Studio中的构建操作设置为&#34;资源&#34; (您可以在xaml文件的属性下找到该设置)。 将构建操作设置为&#34; Page&#34;它会编译!