技术开发 频道

WPF 企业应用基础 WPF的千年轮回

  那么通过Reflector可以查看到它的IL代码,如果感兴趣的朋友也可以进行详细的分析。

3

  如果对MSIL比较熟悉的朋友,也可以用记事本写同样功能的IL代码,由于没有对WPF窗体的IL做具体研究,所以用Console程序代替,等过一段时间再研究WPF控件的IL代码.

.assembly extern mscorlib { auto }

.assembly HelloApp {}
.module HelloApp.exe.namespace HelloApp
{    
.class
public Program extends [mscorlib]System.Object  
{      
  .method static
private void Main(string[] args)  
      {          
.entrypoint                        ldstr
"Hello, KnightsWarrior!"    
        
call void [mscorlib]System.Console::WriteLine(string)
           ret    
    }  
  }
}

   然后打开 Visual Studio Command Prompt,使用 ILASM 开始编译,

3

  这样你就更能看清楚编译器背后的秘密,同时也能跟踪每一步执行的操作,同时对一些简单的内存泄露问题也比较容易察觉到。当然现在也有很多工具可以跟踪这些问题,我这里只是写一种思路,大家可以根据自己的爱好取舍。

  六,XamlReader与XamlWriter

  System.Windows.Markup 命名空间中提供了 XamlReader、XamlWriter 两个类型,允许我们手工操控 XAML和BAML 文件。

  XamlReader类除了定义Load的实时加载之外,也定义了异步方法,可以异步解析XAML中的内容。我们可以在XamlReader对象的实例里调用它们。如果在读取一个大文件时要保持用户UI的响应性,就可以使用异步读取的方法。和异步读取方法匹配的还有一个CancelAsync方法,用于停止读取操作。XamlReader 还定义了LoadCompleted事件,在读取完成后会触发该事件,那么我们就可以把读完后要做的事情都在这里进行处理。

3

  XamlWriter 供一个静态 Save 方法(多次重载),该方法可用于以受限的 XAML 序列化方式,将所提供的运行时对象序列化为 XAML 标记。这句话似乎有点难懂,其实简单的说就是把它序列化为我们需要的类型。

3

  具体功能代码如下: 

  通过XamlReader 动态构建并实例化一个Window

//XamlReader
  StringBuilder strXMAL
= new StringBuilder("<Window ");
strXMAL.Append(
"xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" ");
strXMAL.Append(
"xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" ");
strXMAL.Append(
"Title=\"Window2\" Height=\"600\" Width=\"600\">");
strXMAL.Append(
"</Window>");
var window
= (Window)XamlReader.Parse(strXMAL.ToString());
window.ShowDialog();

   同时我们还可以从文件流中读取并操作。

//XamlReader
using  (var  stream
= new  FileStream(@"Window2.xaml", FileMode.Open))
{  
  var  window2
= (Window)XamlReader.Load(stream);  
  var  button
= (Button)window2.FindName("btnTest");
   button.Click
+= (x, y) => MessageBox.Show("Knights Warrior");  
  window2.ShowDialog();}

   Window2.xaml 的代码:

<Window x:Class="XamlReaderWriterDemo.Window2"
   xmlns
="http://schemas.microsoft.com/winfx/2006/
xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
Title
="Window2" Height="300" Width="300">
  
<Grid>      
  
<Button Height="23" Name="btnTest" Margin="98,72,105,0" VerticalAlignment="Top">
Button
</Button>
  
</Grid>
</Window>

   

0
相关文章