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

Posted

技术标签:

【中文标题】通过 XAML 将图像设置为按钮背景【英文标题】:Set Image as Button Background through XAML 【发布时间】:2011-09-08 11:35:34 【问题描述】:

我正在尝试通过 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>

这不是转换器的具体问题,因为相同的逻辑可以在我的树视图节点中显示图像。我在这里做错了什么?

【问题讨论】:

【参考方案1】:

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

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

编辑: 添加了 DataBinding 的调试。

【讨论】:

不需要它们的包装标签(如果你不知道的话)。 @H.B. “他们包装标签......”是什么意思? 这些:&lt;Button.Content&gt;...&lt;/Button.Content&gt; @ganeshran:那么你的绑定就和我想的一样坏了。 @ganeshran 那么IconPath的内容是什么?【参考方案2】:

我不确定转换器在做什么。简单地将IconPath 绑定到ImageBrush.ImageSource 应该可以在没有转换器的情况下直接工作。

如果它不起作用,请尝试在按钮的内容中设置一些面板,并将面板的背景设置为 ImageBrush。像这样……

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

【讨论】:

【参考方案3】:

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

【讨论】:

它与转换器无关。因为这适用于同一视图中的 TreeViewItem。它与 Button 控件本身有关。 @ganeshran:我从来没有说过关于转换器不工作的任何事情。看看人们怎么说... @ganeshran:此外,我很确定这与 Button 无关。 好的,我以为您的意思是从 Bound 属性转换。我正在尝试调试绑定。【参考方案4】:

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

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

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

每个动画中使用了多种颜色,所有颜色都硬编码到默认(隐式)模板中,并且不通过命名属性公开。如果不打开 ControlTemplate 的引擎盖,您将无法更改这些内容。 Background 属性在所有这些动画的外观中只起次要作用。换句话说,Background 并没有按照您的预期进行。

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

得到你想要的东西的可能方法:

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

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

创建修改后的 ControlTemplate,并将其作为样式应用到页面中的按钮。 Here's an introduction.

【讨论】:

我花了很长时间才整理出或多或少相同的东西。 My approach 可能对你有用。

以上是关于通过 XAML 将图像设置为按钮背景的主要内容,如果未能解决你的问题,请参考以下文章

具有颜色和背景图像的按钮

Xcode 7.3.1:将背景图像设置为 UINavigationBar 并显示返回按钮

将按钮调用的图像加载到按钮的背景中[关闭]

将视图背景设置为能够缩放的图像

C#/XAML 将图像添加到按钮

集合视图按钮背景图像在滚动时重复