通过XAML将图像设置为按钮背景

时间:2011-09-08 11:35:35

标签: c# .net wpf xaml mvvm

我正在尝试通过XAML将图像设置为按钮的背景。我有一个转换图标路径的值转换器并返回一个位图图像

public static BitmapImage GetImage(String name)
{ 
      //return new BitmapImage from the location of the Path
}

我尝试将Image对象直接设置为Button的内容但是没有用。然后我尝试在Button.BackGround中设置ImageBrush标签的源,但仍然无效。

<Button  Margin="3" HorizontalAlignment="Stretch" Grid.Row="1" Grid.Column="0">
    <Button.Background>
        <ImageBrush ImageSource="{Binding Path=IconPath, Converter={StaticResource ImageSourceConverter}}" />
    </Button.Background>
</Button>

它并不特别是转换器的问题,因为Same逻辑用于在我的treeview节点中显示图像。我在这里做错了什么?

4 个答案:

答案 0 :(得分:5)

如果我理解你的话,最初你想将按钮的内容绑定到一个图标:

<Button Grid.Column="1">
        <Button.Content>
            <Image Source="{Binding IconPath, PresentationTraceSources.TraceLevel=High}" />
        </Button.Content>
</Button>

修改
添加了DataBinding的调试。

答案 1 :(得分:3)

我不确定转换器在做什么。简单地将IconPath绑定到ImageBrush.ImageSource应该可以直接使用而无需转换器。

如果它不起作用,那么尝试在Button的内容中设置一些面板,并将Panel的背景设置为ImageBrush。像这样......

  <Button>
     <Grid>
        <Grid.Background>
            <ImageBrush ImageSource="../mypath/myimage.png"/>
        </Grid.Background>
     </Grid>
  </Button>

答案 2 :(得分:1)

很难说,我怀疑绑定失败,你的DataContext可能是错误的,在转换器中设置断点并查看传入的值,除此之外,请参阅提供更多建议的this article on debugging

答案 3 :(得分:1)

我不确定,但我可以提供一些有用的信息。

最近我尝试做一些更简单的事情:更改按钮上的背景颜色 - 实际上是ToggleButton。我发现在代码中设置ToggleButton的Background属性并没有达到我的预期。这让我感到惊讶。搜索,你会看到“我如何设置ToggleButton的背景?”这是一个常见的问题,似乎没有简单的答案。我已经知道为什么它如此复杂。

ToggleButton有一个ControlTemplate,它提供正在运行的东西的视觉外观。在默认的ControlTemplate中,有为各种状态转换提供的动画。当按下按钮时,会有一个WPF执行的动画(我相信这是针对WPF4,Silverlight,并且不确定以前的版本)。当你悬停时,还有另一个动画。等等。 Button also has a ControlTemplate。有一种称为VisualStateManager的东西可以帮助管理所有这些动画。

每个动画中使用的颜色很多,都是硬编码到默认(隐式)模板中,而不是由命名属性公开。如果不打开ControlTemplate的引擎盖,就无法更改它们。 Background属性在所有这些动画的外观中只起很小的作用。换句话说,背景不会做你所期望的。

你可能遇到了同样的事情。我不是WPF专家,这就是我对冲的原因。

获得所需内容的可能方法:

  • 而不是设置背景,设置属性BorderBrush。这是用来画画的画笔 按钮,在默认的ControlTemplate中,我想。

  • 创建您自己的控件,更简单,没有ControlTemplate中的动画,并允许背景按您的意愿运行。

  • 创建一个修改过的ControlTemplate,并将其作为样式应用于页面中的按钮。 Here's an introduction