通过 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. “他们包装标签......”是什么意思? 这些:<Button.Content>...</Button.Content>
@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 将图像设置为按钮背景的主要内容,如果未能解决你的问题,请参考以下文章