Относительный путь не разрешен в шаблоне Binding WPF
Я пытаюсь создать кнопку изображения в WPF. Что я сделал, так это
- Создайте пользовательский элемент управления, унаследованный от Button, и объявите в нем свойство зависимости, которое должно иметь требуемое изображение.
- В ресурсном словаре объявите шаблон xaml для него.
- Передайте относительный и полный путь к этому свойству зависимости, полный путь работает, но не относительный.
Класс управления пользователем
public class ButtonWithImage : Button
{
public ImageSource ButtonImage
{
get { return (ImageSource)GetValue(ButtonImageProperty); }
set { SetValue(ButtonImageProperty, value); }
}
// Using a DependencyProperty as the backing store for ButtonImage. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ButtonImageProperty =
DependencyProperty.Register("ButtonImage", typeof(ImageSource), typeof(ButtonWithImage));
}
Код ресурса словаря
<Style x:Key="ButtonWithImageStyle" TargetType="complaintRegister:ButtonWithImage">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="complaintRegister:ButtonWithImage">
<StackPanel>
<Image Source="{Binding ButtonImage, RelativeSource={RelativeSource TemplatedParent}}" Width="50" Height="50"/>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
XAML
<complaintRegister:ButtonWithImage x:Name="ButtonAdd" Content="Add New Complaint" Style="{StaticResource ButtonWithImageStyle}"
ButtonImage="Resources\Plus.png"
Width="150" Height="75" Margin="10 0" Command="{Binding NewCommand}">
</complaintRegister:ButtonWithImage>
ошибка
Он отображает изображение в режиме конструктора, но во время выполнения выдает это исключение
Cannot locate resource 'resources/plus.png'
Я не могу помочь, но думаю, что он пытается разрешить "resources/plus.png" вместо "Resources/Plus.png".
1 ответ
Бьюсь об заклад, в окне вывода отображается ошибка привязки.:)
Как насчет того, чтобы опубликовать нам это сообщение об ошибке здесь.
Кстати, в таких случаях более целесообразно использовать TemplateBinding вместо RelativeSource TemplatedParent.
TemplateBinding позволяет говорить это так, чтобы он хорошо работал в шаблоне элемента управления.:)
Проверьте эти ссылки:
http://msdn.microsoft.com/en-us/library/ms742882(v=vs.110).aspx
http://www.codeproject.com/Tips/599954/WPF-TemplateBinding-with-ControlTemplate
Редактировать:
Аааа, вы говорите о местонахождении вашего изображения.
По умолчанию элемент управления Image распознает скомпилированное изображение ресурса только при использовании XAML для указания его свойства Source. Но мы можем использовать конвертер или пользовательское расширение разметки для достижения этой цели. Следующие ссылки содержат информацию о конвертере привязки данных и расширении разметки.
Поэтому установите этот png для сборки action -> resource и пересоберите ваше решение или используйте это:
<Image>
<Image.Source>
<BitmapImage UriSource="../Relative/Path/To/Image.png" />
</Image.Source>
</Image>
Хотя, если вы хотите использовать MVVM для этого и изменить путь на основе данных, я предлагаю вам использовать Bindings:
<Image Source="{Binding MyPath}" Height="50"... />