获取自定义组件内的相对路径

时间:2013-09-15 10:22:05

标签: c# xaml windows-phone-8 navigation uri

我有一个自定义组件项目,我从另一个项目中引用。

我需要在自定义组件的页面之间导航,因此我正在使用此代码:

var frame = Application.Current.RootVisual as PhoneApplicationFrame;
frame.Navigate(new Uri("/CustomComponent;component/Page.xaml", UriKind.Relative));

现在,只要我的自定义组件具有如下结构:

Root Folder
       \_ Page.xaml
       \_ Folder A
                 \_ BaseClass.cs
       \_ Folder B
                 \_ Folder C
                           \_ Class.cs (extends BaseClass)
                           \_ Page2.xaml

我想在Class.cs内调用一个方法,该方法返回一个字符串,允许我使用我发布的导航代码导航到Page2.xaml

所以,这个方法应该返回

  

/ CustomComponent;组件/文件夹B /文件夹C / Page2.xaml

/CustomComponent;component/是可选的,但是我需要它来返回正确的文件夹结构以导航到页面)

我一直在尝试使用Directory类,但GetCurrentDirectory()方法返回并指向应用程序安装文件夹的绝对路径,我需要它是一个遵循组件结构的相对路径。

1 个答案:

答案 0 :(得分:0)

这是一个获取调用函数的绝对路径的函数:

    public static string GetFilePathLoc([CallerFilePath] string filePath = "")
    {
        return filePath;
    }

您可以发布进程以仅提取相对部分,例如通过创建RootClass并从它和Class1中调用GetFilePathLoc:

    public abstract class BaseClass
{
    public string GetResourceFilePath()
    {
        string assemblyName = Assembly.GetExecutingAssembly().FullName;
        assemblyName = assemblyName.Substring(0, assemblyName.IndexOf(','));


        string myFilePath = GetRealClassPath();

        //If base class is in the root directory, this could just be replaced by string projectFolder = GetFilePathLoc();
        string projectFolder = RootClass.GetPath();

        //Remove the "absolute part" of the path
        myFilePath = myFilePath.Substring(projectFolder.Length);
         myFilePath=myFilePath.Replace('\\', '/');

        return "/" + assemblyName + ",component/" + myFilePath;
    }

    protected abstract string GetRealClassPath();

    protected static string GetFilePathLoc([CallerFilePath] string filePath = "")
    {
        int indexFileName= filePath.LastIndexOf('\\');
        return filePath.Substring(0, indexFileName+1);
    }
}


public class Class1 :BaseClass
{
    protected override string GetRealClassPath()
    {
        return GetFilePathLoc(); 
    }
}