模板绑定WPF中未解析相对路径

时间:2013-10-28 19:03:41

标签: wpf xaml dependency-properties templatebinding

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

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

      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 个答案:

答案 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"... />