WPF VS设计时数据上下文,VS设计器魔改
VS的WPF设计器可以在设计时为WPF页面指定数据上下文
指定后有如下好处:
- 实时显示预览Model内的数据
- 可以从Xaml代码导航跳转到C#代码
默认情况:
指定设计时上下文后:
但我认为这个操作有如下缺点:
- 需要手动指定 local:MainWindowViewModel,没有默认数据发现的能力
- 默认需要设置 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更新可能都要替换