Проблема относительного пути WPF

Я создал собственный элемент управления TaskButton, который принимает изображение и текст. Свойства устанавливаются следующим образом:

<custom:TaskButton Text="Calendar" ImagePath="Images/calendar.png" ... />

Мой класс пользовательского элемента управления реализует свойства Text и ImagePath, а шаблон элемента управления для пользовательского элемента управления (в Themes\Generic.xaml) устанавливает его содержимое следующим образом, используя объект RelativeSource для получения пути к изображению:

<!-- Button Content -->
<StackPanel>
    <Image Source="{Binding Path=ImagePath, RelativeSource={RelativeSource TemplatedParent}}" Width="24" Height="24" Stretch="Fill" Margin="10,0,0,0" />
    <TextBlock Text="{TemplateBinding Text}" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Segoe UI" FontWeight="Bold" Margin="6,0,10,0" Foreground="Black" />
</StackPanel>

В большинстве случаев элемент управления работает нормально, но в конкретном проекте относительный путь к изображению кнопки не определяется правильно, и изображение кнопки не отображается. Вот что я понял до сих пор:

  • Я правильно ввожу путь, когда использую пользовательский элемент управления. Если я помещаю элемент управления изображением на ту же поверхность дизайна с тем же относительным путем, он разрешается правильно.

  • Проблема с относительным путем. Если я заменю относительный путь абсолютным путем, путь будет правильно разрешен, и изображение отобразится.

Как я уже упоминал выше, в большинстве случаев управление работает нормально. Единственный случай, когда он не работает, — это проект Prism 2.1, где элемент управления создается в пользовательском элементе управления в модуле Prism. Модуль представляет собой простую библиотеку классов, но в нем есть все ссылки проекта WPF.

Любая идея, почему относительный путь потерпит неудачу? Заранее спасибо за помощь.


person David Veeneman    schedule 02.01.2010    source источник
comment
Кстати, я знаю, что я мог бы сделать то же самое, используя шаблон управления с ContentPresenter. В спецификациях проекта требуется настраиваемый элемент управления с указанными свойствами.   -  person David Veeneman    schedule 02.01.2010
comment
У меня нет идей, можете ли вы показать соответствующий код, который создает пользовательский элемент управления с вашим пользовательским элементом управления?   -  person Aviad P.    schedule 03.01.2010


Ответы (1)


Я наконец понял проблему. На самом деле это был класс поддержки C # для моего контроля. Я объявил свойство ImagePath в виде строки, поскольку именно так я собирался указать изображение. Ой, плохой звонок с моей стороны. На самом деле это свойство должно быть свойством ImageSource, а не строкой. WPF имеет встроенный класс ImageSourceConverter. который разрешит путь и вернет указанное изображение. Итак, я просто изменил имя свойства с ImagePath на Image и изменил его тип со строки на ImageSource. Это решило проблему.

Спасибо Авиаду П. за то, что он решился на это. Это было неразрешимо без кода C#, показывающего объявления свойств. Я опубликую весь код и разметку в следующий раз.

person David Veeneman    schedule 03.01.2010