C# 如何获取应用程序';我的WPF应用程序中的s目录,在设计时?
如何在设计时从我的WPF应用程序获取应用程序的目录?我需要在设计时访问我的应用程序当前目录中的资源,而我的XAML正在设计器中显示。我无法在设计时使用as中指定的解决方案,C# 如何获取应用程序';我的WPF应用程序中的s目录,在设计时?,c#,.net,wpf,working-directory,C#,.net,Wpf,Working Directory,如何在设计时从我的WPF应用程序获取应用程序的目录?我需要在设计时访问我的应用程序当前目录中的资源,而我的XAML正在设计器中显示。我无法在设计时使用as中指定的解决方案,System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)和System.Reflection.Assembly.getExecutionGassembly().Location指向IDE的位置(Visual Studio…C
System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)
和System.Reflection.Assembly.getExecutionGassembly().Location
指向IDE的位置(Visual Studio…Common7或其他)
在要求进一步澄清我的目标时:我希望在设计时访问数据库表并显示该数据的图形。设计是在Visual Studio 2008中完成的,因此我需要的是一个非常具体的问题的非常具体的解决方案,这就是获取我的应用程序的程序集目录。我认为这是不可能的-您需要的是一个可能尚未生成的程序集的位置。设计时代码不会在应用程序中运行,因此必须对IDE进行一些假设。这种感觉对我来说是错误和易碎的——考虑以下问题:
- 项目建成了吗
- 如果没有,那么就没有可执行文件可获取路径,那又怎样呢
- 如果没有构建其他文件,它们会出现吗?或者它们是构建人工制品吗
- 如果它已经建成,它是建在哪里的 你需要考虑其他问题吗?
在这种情况下,您可能应该在设计时要求用户通过在对象上添加属性来提供或浏览路径,以便用户进行编辑。然后,您的设计时代码可以使用属性的值来查找它所需的内容。您是否正在尝试支持设计器(如visual studio设计器或Blend) 如果是这样,那么有各种不同的方法来解决这个问题。您通常不希望依赖可执行文件的相对路径,因为它可以托管在各种不同的设计工具(VS、Expression Blend等)中
也许您可以更全面地解释您试图解决的问题,以便我们能提供更好的答案?好的,如果这里有进一步的澄清,我会做的 与格雷梅夫提出的担忧保持一致,做你想做的事是脆弱的,最多也容易破碎 因此,一般做法是将设计时数据支持视为与运行时数据支持完全不同的方法。很简单,您在设计时环境和这个数据库之间创建的耦合是一个坏主意 为了简单地为可视化提供设计时数据,我更喜欢使用一个遵循公共接口的模拟类作为运行时类。这为我提供了一种显示数据的方法,我可以确保数据的类型正确,并且与我的运行时对象符合相同的约定。然而,这是一个完全不同的类,用于设计时支持(通常用于单元测试) 比如说。如果我有一个运行时类,需要显示人员详细信息,如名字、姓氏和电子邮件:
public class Person()
{
public String FirstName { get; set;}
public String LastName {get; set;}
public Email EmailAddress {get; set;}
}
我在运行时从DB填充这个对象,但还需要提供设计时可视化,我将引入一个IPerson接口,定义要遵守的契约,即强制属性getter存在:
public interface IPerson()
{
String FirstName { get; }
String LastName { get; }
Email EmailAddress { get; }
}
然后,我将更新我的runtime Person类以实现接口:
public class Person() : IPerson
{
public String FirstName { get; set;}
public String LastName {get; set;}
public Email EmailAddress {get; set;}
}
然后,我将创建一个模拟类,该类实现相同的接口,并为设计时使用提供合理的值
public MockPerson() : IPerson
{
public String FirstName { get { return "John"; } }
public String LastName { get { return "Smith"; } }
public Email EmailAddress { get { return new Email("John@smith.com"); } }
}
然后我将实现一种机制,在设计时提供MockPerson对象,在运行时提供RealPerson对象。类似于或。这提供了设计时数据支持,而不需要运行时环境和设计时环境之间的硬依赖关系
此模式更加灵活,并允许您在整个应用程序中提供一致的设计时数据支持。从您的描述中可以看出,您的代码实际上是在Visual Studio中的WPF设计器中运行的,例如,它是用于设计的自定义控件库的一部分 在本例中,
Assembly.GetEntryAssembly()
返回null,但以下代码获取应用程序目录的路径:
string applicationDirectory = (
from assembly in AppDomain.CurrentDomain.GetAssemblies()
where assembly.CodeBase.EndsWith(".exe")
select System.IO.Path.GetDirectoryName(assembly.CodeBase.Replace("file:///", ""))
).FirstOrDefault();
以下步骤可用于演示VS.NET 2008的WPF设计器工具中的工作原理:
同样的技术也适用于其他场景,并且根据您的需要,还有其他可用的解决方案。如果您的需求与我上面假设的不同,请告诉我们。例如,如果您正在编写一个VS.NET加载项,那么您将处于完全不同的状态。如果您正在广泛使用adorner等来处理WPF设计器,请使用“上下文”属性/类型 详细信息:- 在设计时,您有modelItem的实例(我假设您知道它),若并没有,那个么您可以在Activate方法的覆盖实现中实例化它 //在Designator类中
public class DesignAdorner : PrimarySelectionAdornerProvider
{
protected override void Activate(ModelItem item)
{
modelItem = item;
}
}
现在哟
string aplicationPathDir = System.IO.Directory.GetParent(modelItem.Context.ToString()).FullName;