我正在尝试在WPF中创建一个图像按钮。我所做的是
用户控制类
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。
答案 0 :(得分:3)
我敢打赌输出窗口中会显示绑定错误。 :)
你怎么在这里向我们发送错误信息。
顺便说一句,在这种情况下,使用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来构建动作 - &gt;资源并重建您的解决方案或使用它:
<Image>
<Image.Source>
<BitmapImage UriSource="../Relative/Path/To/Image.png" />
</Image.Source>
</Image>
虽然如果您希望在此基础上使用MVVM并根据数据更改路径,我建议您使用Bindings:
<Image Source="{Binding MyPath}" Height="50"... />