Как получить доступ к встроенному шрифту из xaml в Iron Python

Я хочу добавить шрифт в приложение WPF Iron Python в качестве ресурса. В файле xaml я хочу использовать этот шрифт в атрибуте xml Fontfamily.

MainWindow.xaml:
...
<Grid>
  <TextBox Text="ABC" FontFamily="./Fonts/#Foo"/>
</Grid>

В коде Python окно загружается в c'tor MainWindow:

MainWindow.py:

class MainWindow (Window):
   def __init__(self):
      wpf.LoadComponent(self, 'MainWindow.xaml')

В проекте я добавляю шрифт в папку «Шрифты» и использую ресурс действия сборки. Но этот подход не работает.


person frankh    schedule 10.11.2012    source источник


Ответы (1)


Вам нужно будет добавить шрифт в текстовое поле с кодом. Метод wpf.LoadComponent() загружает файл .xaml с диска и создает окно WPF, но не будет искать во встроенных ресурсах что-либо, включая шрифты. Самый простой способ, насколько я знаю, это загрузить шрифт с диска.

Сначала измените действие сборки для вашего шрифта, чтобы Копировать в выходной каталог было Всегда. В вашем примере шрифт будет скопирован в папку bin\Debug\Fonts\.

Теперь вам нужно будет дать вашему текстовому полю имя, чтобы вы могли получить к нему доступ с помощью кода. В файле MainWindow.xaml добавьте атрибут x:Name в текстовое поле. Здесь я назвал его textbox.

<Grid>
    <TextBox x:Name="textbox" Text="ABC"/>
</Grid>

Теперь в вашем классе MainWindow вы можете добавить свойство для своего текстового поля и в конструкторе написать некоторый код для загрузки шрифта с диска и применения его к вашему текстовому полю. Полный код показан ниже.

import wpf

from System import Uri
from System.IO import Path
from System.Windows import Window
from System.Windows.Media import FontFamily

class MainWindow(Window):
    def __init__(self):
        wpf.LoadComponent(self, 'MainWindow.xaml')
        self.addFont()

    def addFont(self):
        fontDirectory = Path.GetFullPath(".\\Fonts\\")
        uri = Uri(fontDirectory)

        fontFamily = FontFamily(uri, "./#Foo")
        self.textbox.FontFamily = fontFamily

    def get_textbox(self):
        return self._textbox

    def set_textbox(self, value):
        self._textbox = value

    textbox = property(get_textbox, set_textbox)

Метод addFont() просто создает Uri, указывающий на каталог, в котором находится ваш шрифт, затем создает новое семейство FontFamily, используя имя семейства шрифтов, и, наконец, обновляет свойство TextBox FontFamily.

person Matt Ward    schedule 11.11.2012
comment
Спасибо. У меня работает нормально. - person frankh; 11.11.2012