Как использовать относительный источник изображения в WPF с использованием IronPython - PullRequest
2 голосов
/ 29 сентября 2011

Я создаю проект WPF с использованием Python Tools для Visual Studio (в VS 2010).Я добавляю элемент управления Image в форму.Я нажимаю «...» в свойстве источника изображения и нахожу изображение.

Это добавляет папку «Изображения» в проект (как в файловой системе, так и в решении) и копирует изображение.в эту папку (снова как в файловой системе, так и в решении).Изображение не отображается в диалоговом окне «Добавить».Для атрибута «Источник» установлено значение «Images / foo.png».

В XAML источник подчеркнут синим цветом, поскольку для «Действия сборки» не задано значение «Ресурс».Единственными доступными действиями по сборке являются «Содержимое», «Компиляция» и «Нет».Я предполагаю, что «Ресурс» недоступен на динамическом языке, таком как IronPython (конечно, встроенный ресурс будет сложным).Я не знаю, является ли это проблемой или ее можно игнорировать.

Изображение не отображается в окне редактирования в реальном времени и не отображается при запуске программы.

Я пробовал "/Images/foo.png" (как предложено здесь ), "pack: // application: ,,, / foo.png", "pack: // application: ,,, / Images / foo.png "," pack: // siteoforigin: ,,, / foo.png "и" pack: // siteoforigin: ,,, / Images / foo.png ".

(Siteoforigin не работает, потому что 'origin' - это ipy.exe. Если я переместу папку Images в папку, где установлен IronPython, то это сработает. Очевидно, это не лучшее решение!).

Я попытался переместить папку «Изображения» в файловой системе в ту же папку, что и решение (то есть на один уровень выше в иерархии), и разместить изображение в той же папке, что и файл .py, а не в подпапке «Изображения».

Если я поменяю источник (прямо в XAML) на абсолютный путь, то он отлично работает.Очевидно, это тоже не лучшее решение!

Как использовать относительный путь для изображения?

Ответы [ 2 ]

3 голосов
/ 01 октября 2011

Это возможно. Очевидно, все, что вам нужно сделать, это указать источник как 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> 

Я думаю, что все из-за конвертеров значений по умолчанию для изображений. Если вы обойдете их, кажется, все сработает.

2 голосов
/ 18 октября 2011

Лучший способ, который я нашел для работы с путями к изображениям, - это просто полностью обойти эту громоздкую бессмысленную pack:// URI-ерунду и просто использовать привязку, которая напрямую привязывается к BitmapImage.

<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
...