在DesignTime为WPF设计人员提供图像

时间:2011-10-14 18:07:01

标签: wpf

这是我的问题的重述,修订历史包含原始的混乱。

归结为“如何在设计时从我的WPF应用程序获取应用程序的目录?”

重复问题here所以,如果你碰巧路过,请投票结束,谢谢。

3 个答案:

答案 0 :(得分:1)

您是否需要将图像设为“内容 - 如果更新则复制”?如果将其切换为“资源”,则可以使用以下路径引用该文件:

"/MyImage.JPG"

或更长版本

"pack://application:,,,/MyImage.JPG"

假设图像位于项目的根目录中,否则只需将URI更改为

"/Some/Path/MyImage.JPG"

更新1:

对我来说,较长的包uri语法适用于标记为“内容 - 如果更新则复制”的图像。但是,较短的语法不起作用。即:

这有效:

"pack://application:,,,/MyImage.JPG"

NOT 工作:

"/MyImage.JPG"

我的示例我将图像添加到项目的根目录,并将其标记为“内容”。然后,我将设计时数据上下文绑定到视图模型,其中属性返回上面的更长包URI。这样做会导致在设计时正确显示内容图像。

更新2:

如果要从包uri加载位图源,可以使用BitmapFrame.Create的另一个重载,它将URI作为第一个参数。

如果我正确理解您的问题,您将获得包uri的字符串作为传递给转换器的对象数组中的第一项。从此字符串中,您要加载BitmapSource。

由于字符串包含包URI,您可以从字符串创建实际的URI,然后使用该URI加载BitmapSource:

var imagePath = values[0] as string;
// ...
try
{
    var packUri = new Uri(imagePath);

        BitmapSource bitmap = BitmapFrame.Create(packUri, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
        {
            // ...
        }
    }
}

答案 1 :(得分:0)

只需在 ImagePath 属性中返回实体中图像的确切路径,例如..

“C:\ myImage.jpg” 这个参数

...

OR

...

“C:\ MyApp的\ BIN \调试\ myImage.jpg” 这个参数

然后.xaml中的绑定(即<Image Source="{Binding ImagePath}" />)将开始工作..

答案 2 :(得分:0)

我通过利用this stackoverflow answer中找到的聪明人解决了这个问题。

public class DMyViewModel : PhotoViewModelBase
{
    public override string ImagePath
    {
        get
        {
            string applicationDirectory =
                (from assembly in AppDomain.CurrentDomain.GetAssemblies()
                 where assembly.CodeBase.EndsWith(".exe")
                 select System.IO.Path.GetDirectoryName(assembly.CodeBase.Replace("file:///", ""))
                 ).FirstOrDefault();
            return applicationDirectory + "\\MyImage.JPG";
        }
    }
}