2012-12-06 45 views
1

我需要加載並使用XAML文件。WPF:加載XAML文件,其中包含x:代碼元素

我已經寫了簡單的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

如果你想在運行時加載xaml,你不能在你的XAML文件後面提供任何代碼。或許你可以在運行時添加Button的點擊和標識控件的一般事件 - 只要看看下面的鏈接並試試它出。

Loading XAML XML through runtime?

+0

謝謝你的聯繫。 來自文檔: >放置在x:代碼中的代碼將被處理爲 >編譯處於已經爲該XAML >頁面創建的部分類的範圍內。因此,您定義的所有代碼必須是成員 >或該分部類的變量。 我將無法使用x:不帶部分類的代碼。 :((( –

+0

)我想寫AutoLISP到AutoCAD的函數,以便從LISP中打開WPF窗口。如果事件處理函數的連接不能在沒有partial類或沒有code.NET的情況下進行,不會幫助我。 –

0

一般提示(我沒重現您的具體問題):

在WPF這個錯誤出現同樣,如果在Visual Studio中生成操作到被設置爲「資源」(你發現xaml文件的屬性下的設置)。 將生成操作設置爲「頁面」,它會編譯!