WPF - 相对于currentdirectory的URI?

时间:2015-05-30 21:09:47

标签: wpf vb.net

我正在将Windows窗体VB项目转换为WPF项目(日记程序)。 在Windows窗体版本中,我在图片框中显示图像,我可以传递完整路径或相对于My.Computer.Filesystem.CurrentDirectory的路径 - 图片框可以解决它。

在新的WPF版本中,我想做同样的事情。但是,这仅适用于绝对路径,而不是相对路径:

#Making First Differences
Table2Y<- diff(Table2Y,1) #This is called dY in the text
Table2C<- diff(Table2C,1) #This is called dC in the text

只是为了确认,图像不是资源,它们在设计时不可用,所以我无法将它们复制到解决方案中,我不想将它们放在可执行文件的目录中(UAC赢了)不管怎样,我想,如果没有它以管理员的身份运行,我就会这样做。

我在这里和其他地方读到的关于WPF URI的所有内容似乎都暗示它们只能相对于可执行目录或工作目录,它似乎只能在My Project中设置 - &gt;设计时调试页面 - 不是我想要的。

我可以让WPF考虑相对于当前目录的URI,还是我必须为它编写自己的测试?

非常感谢

尼克

修改

顺便说一下,我在此期间使用的测试是:

lm(Table2C~Table2Y)
summary(lm(Table2C~Table2Y))

1 个答案:

答案 0 :(得分:0)

您应该能够通过执行以下操作将相对于当前目录的路径转换为绝对路径:

Path.Combine(Directory.GetCurrentDirectory(), relativePath)

然后使用生成的路径创建一个可以使用的绝对Uri

编辑:鉴于要求传入路径可以是相对于当前目录的绝对路径路径,我建议编写一个实用程序帮助方法,如下所示:

/// <summary>
/// Given a file system path, will return an absolute Uri representing that path.
/// </summary>
/// <param name="path">The file system path to turn into a Uri</param>
/// <returns>
/// If the provided path is absolute, returns an absolute Uri representing that path.
/// If the provided path is relative, returns an absolute Uri representing that path relative to the current directory.
/// </returns>
/// <exception cref="ArgumentNullException">The provided path value is null</exception>
/// <exception cref="ArgumentException">The provided path value is an empty string or invalid file system path</exception>
public static Uri GetAbsoluteUri(string path)
{
    if (path == null) throw new ArgumentNullException("path");
    if (path == string.Empty) throw new ArgumentException("Path cannot be an empty string.", "path");

    Uri uri;
    if (Uri.TryCreate(path, UriKind.Absolute, out uri))
    {
        return uri;
    }
    if (Uri.TryCreate(path, UriKind.Relative, out uri))
    {
        Uri baseUri = new Uri(Directory.GetCurrentDirectory(), UriKind.Absolute);
        Uri newUri;
        if (Uri.TryCreate(baseUri, uri, out newUri))
        {
            return newUri;
        }
    }

    throw new ArgumentException("The provided path could not be converted to a Uri.", "path");
}

您可以为此方法提供任何路径,并返回一个您应该能够使用的绝对Uri。如上所述,如果传递无效路径,它将抛出异常,但您可以根据需要自定义它。

编辑:我忘了这个问题是VB而不是C#。我试图将方法转换为VB。请原谅我,如果因为我没有使用VB的经验而不完全正确。

Public Shared Function GetAbsoluteUri(path As String) As Uri
    If (path Is Nothing) Then
        Throw New ArgumentNullException("path")
    End If
    If (path = String.Empty) Then
        Throw New ArgumentException("Path cannot be an empty string.", "path")
    End If

    Dim inUri As Uri = Nothing
    If (Uri.TryCreate(path, UriKind.Absolute, inUri)) Then
        Return inUri
    End If
    If (Uri.TryCreate(path, UriKind.Relative, inUri)) Then
        Dim baseUri As Uri = New Uri(Directory.GetCurrentDirectory(), UriKind.Absolute)
        Dim newUri As Uri = Nothing
        If (Uri.TryCreate(baseUri, inUri, newUri)) Then
            Return newUri
        End If
    End If

    Throw New ArgumentException("The provided path could not be converted to a Uri.", "path")
End Function