1

我正在尝试在 WPF 中创建一个图像按钮。我所做的是

  1. 创建一个从 Button 继承的用户控件,并在其中声明一个依赖属性,该属性应该具有所需的图像。
  2. 在资源字典中为其声明 xaml 模板。
  3. 将相对路径和完整路径传递给该依赖属性,完整路径有效,但相对路径无效。

用户控制类

  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”。

4

1 回答 1

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 设置为构建操作 -> 资源并重建您的解决方案或使用它:

<Image>
    <Image.Source>
        <BitmapImage UriSource="../Relative/Path/To/Image.png" />
    </Image.Source>
</Image>

虽然如果您希望在此使用 MVVM 并根据数据更改路径,我建议您使用绑定:

<Image Source="{Binding MyPath}" Height="50"... />
于 2013-10-28T19:13:00.320 回答