如何使用IronPython在WPF中使用相对图像源

时间:2011-09-28 22:51:12

标签: visual-studio xaml ironpython

我正在使用Python Tools for Visual Studio创建一个WPF项目(在VS 2010中)。我向表单添加了一个Image控件。我单击Image的Source属性中的“...”,然后找到一个图像。

这会在项目中添加“Images”文件夹(在文件系统和解决方案中),并将图像复制到该文件夹​​(同样在文件系统和解决方案中)。图像显示在“添加”对话框中。 Source属性设置为“Images / foo.png”。

在XAML中,源是蓝色下划线,因为“​​Build Action”未设置为“Resource”。唯一可用的构建操作是“内容”,“编译”和“无”。我认为“资源”在IronPython这样的动态语言中是不可用的(当然嵌入式资源会很复杂)。我不知道这是问题还是可以忽略。

图像不会在实时编辑窗口中显示,也不会在程序运行时显示。

我试过“/Images/foo.png”(如建议here),“pack:// application:,,, / foo.png”,“pack:// application:,, ,/ Images / foo.png“,”pack:// siteoforigin:,,, / foo.png“和”pack:// siteoforigin:,,, / Images / foo.png“。

(siteoforigin不起作用,因为'origin'是ipy.exe。如果我将Images文件夹移动到安装IronPython的文件夹,那么这确实有效。显然不是一个很好的解决方案!)。

我已经尝试将文件系统中的Images文件夹移动到与解决方案相同的文件夹(即层次结构中的一个级别),并将图像放在与.py文件相同的文件夹中,而不是在Images子文件夹中

如果我将源(直接在XAML中)更改为绝对路径,那么它可以完美地工作。显然这也不是一个好的解决方案!

如何使用图像的相对路径?

2 个答案:

答案 0 :(得分:3)

有可能。显然,您需要做的就是将源指定为BitmapImage,相对URI将使用当前目录作为基础。忽略有关文件不是资源的警告,这并不重要。它将在您运行程序时显示。

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Title="MyWpfApplication" Height="300" Width="300">
    <Grid>
        <Image>
            <Image.Source>
                <BitmapImage UriSource="../Relative/Path/To/Image.png" />
            </Image.Source>
        </Image>
    </Grid>
</Window> 

我认为这完全归功于图像的默认值转换器。如果你绕过使用它们,这一切似乎都可以解决。

答案 1 :(得分:2)

我发现处理图像路径的最好方法是完全绕过那个庞大的pack:// URI废话并简单地使用直接绑定到BitmapImage的Binding。

<Image Source="{Binding imgWarningYellow}" Height="50" HorizontalAlignment="Center" VerticalAlignment="Center" />

这样,我可以在代码中使用简单的GetFullPath文件系统调用来找到该死的东西并将其加载为BitmapImage

yellowbitmap = System.Windows.Media.Imaging.BitmapImage()
yellowbitmap.BeginInit()
yellowbitmap.UriSource = System.Uri(System.IO.Path.GetFullPath("Images\warning-yellow50.png"))
yellowbitmap.DecodePixelHeight = 50
try:
    yellowbitmap.EndInit()
except System.IO.FileNotFoundException as e:
    print e.Message
else:
    self.imgWarningYellow = yellowbitmap