【问题标题】:Set Image as Button Background through XAML通过 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>

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

【问题讨论】:

    标签: c# .net wpf xaml mvvm


    【解决方案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 可能对你有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多