WPF VS设计时数据上下文,VS设计器魔改

VS的WPF设计器可以在设计时为WPF页面指定数据上下文
指定后有如下好处:

  1. 实时显示预览Model内的数据
  2. 可以从Xaml代码导航跳转到C#代码

默认情况:

指定设计时上下文后:

但我认为这个操作有如下缺点:

  1. 需要手动指定 local:MainWindowViewModel,没有默认数据发现的能力
  2. 默认需要设置 IsDesignTimeCreatable 为 true

于是,我将它编写成了这样

d:DataContext="{t:CreateDesignViewModel}"

这个过程比较艰辛,在xaml页面设计时,VS将你的xaml文件套在他的命名空间
也就是说你拿不到Counter.MainWindow这个类名


通过抛异常的方式得到标记的提示路径

注意到有个~MainWindow.xaml的文件,VS将debug目录下的文件拷贝到此处
通过炸开这个路径,拿到文件名并反射文件夹下的所有程序集,匹配MainWindow类名
通过MainWindow找到规范对应的MainWindowViewModel,最终创建实例返回给标记

BUT

我自定义的标记使得设计器失去了跳转的功能

魔改

通过找到
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\SurfaceProcess\Wpf\Framework\x86
路径下发现WpfSurface.exe这个文件
每次编译后设计器将它拷贝到临时目录,并运行你的xaml文件
对它进行一点点改动,让IsDesignTimeCreatable不设置为true也能创建上下文

实验是有效的,只不过每次VS更新可能都要替换

posted @ 2023-01-01 15:20  trykle  阅读(190)  评论(0编辑  收藏  举报