在 XAML 设计器 (XDesProc.exe) 中评估项目完整路径

Sam*_*Sam 5 c# wpf design-time mvvm visual-studio

我有UserControl显示文件信息。我想使用视图模型模拟在 Visual Studio 设计器中查看测试文件信息。这是 XAML:

<Label Content="{Binding DateCreated}"/>
Run Code Online (Sandbox Code Playgroud)

视图模型:

internal class ViewModel
{
    public ViewModel(string pathToFile) 
    {
        var file = new FileInfo(pathToFile);
        this.DateCreated= file.CreationTime.ToShortDateString();
    }

    public string DateCreated{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在设计时,我使用视图模型模拟类在设计器中看到真实的文件信息:

internal class ViewModelMock : ViewModel
{
    public ViewModelMock() : base(@"D:\Images\mock.png")
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我通过d:DataContext和插入模拟到xaml d:DesignInstance:

<UserControl ...
    xmlns:mocks="clr-namespace:Company.Product.Mocks"
    d:DataContext="{d:DesignInstance mocks:ViewModelMock, DesignTimeCreatable=True}">
Run Code Online (Sandbox Code Playgroud)

它有效,但问题出在这个@"D:\Images\mock.png" 硬编码的 value 中。一旦解决方案由 TFS 提供支持,我需要将图像放入项目中,并从ViewModelMock, 相对于项目路径引用此图像。

我怎样才能做到这一点?

像获取当前工作目录这样的简单方法给出了“ C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE ”,我猜是因为这是负责 Visual Studio 设计器的 XDesProc.exe 的位置。

目前我使用EnvDTE描述的方法在 此 问题:

var solutionFullName = ((EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.12.0")).Solution.FullName;
var projectPath = Path.Combine(Path.GetDirectoryName(solutionFullName), "ProjectFolderName");
Run Code Online (Sandbox Code Playgroud)

但这几乎有相同的问题 - 硬编码的“VisualStudio.DTE.12.0”常量(这意味着 Visual Studio 2013),所以我仍在努力寻找更好的解决方案。