创建带有图像和文本的WPF按钮

5
我希望能创建一个按钮模板,以便在按钮中显示图像和标签。我考虑在按钮上使用一个水平堆栈面板。但是我无法成功显示标签。
以下是我的模板:
<ControlTemplate TargetType="{x:Type Button}" x:Key="BoutonImageEtTexte">
<Button Grid.Column="2" BorderBrush="Transparent" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" Width="90" Height="27" >
    <Button.Content>
        <StackPanel Orientation="Horizontal">
            <Border CornerRadius="3">
                <ContentPresenter/>
                <Border.Style>
                    <Style TargetType="{x:Type Border}">
                        <Setter Property="Background" Value="#58585a" />
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="{StaticResource DegradeCouleurTheme}" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </Border.Style>
            </Border>
            <Label>
                <Label.Content>Fichiers joints</Label.Content>
                <Label.Foreground>white</Label.Foreground>
                <Label.VerticalAlignment>center</Label.VerticalAlignment>
                <Label.HorizontalAlignment>center</Label.HorizontalAlignment>
            </Label>
        </StackPanel>
    </Button.Content>
    <Button.Style>
        <Style TargetType="{x:Type Button}" >
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}" >
                        <ContentPresenter />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Style>
</Button>

这是我对此模板的调用:

<Grid Margin ="10,180,10,14">
            <Button Template="{StaticResource BoutonImageEtTexte}" HorizontalAlignment="Left" Margin="13,0,0,0"> 
                <Image Source="ToolBar_FicJoints.png" />
            </Button>
        </Grid> 

这里有另一种使用文本框而非标签的方法。
    <ControlTemplate TargetType="{x:Type Button}" x:Key="BoutonImageEtTexte">
    <Button Grid.Column="2" BorderBrush="Transparent" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" Width="90" Height="27" >
        <Button.Content>
            <StackPanel Orientation="Horizontal">
                <Border CornerRadius="3">
                    <ContentPresenter/>
                    <Border.Style>
                        <Style TargetType="{x:Type Border}">
                            <Setter Property="Background" Value="#58585a" />
                            <Style.Triggers>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter Property="Background" Value="{StaticResource DegradeCouleurTheme}" />
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </Border.Style>
                </Border>
                    <TextBlock Text="LabelText" />
                </StackPanel>
        </Button.Content>
        <Button.Style>
            <Style TargetType="{x:Type Button}" >
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}" >
                            <ContentPresenter />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Button.Style>
    </Button>
</ControlTemplate>

我的问题是我只看到我的图像,而没有在模板中指定的标签。 有人能帮我吗? 非常感谢 :)

1
你的理念完全错误。如果想创建一个控件模板来接收多个项目作为内容,必须创建一个额外的依赖属性。 - TYY
请给我一个例子,以便我能够做到这一点? - Walter Fabio Simoni
1
这似乎是一篇不错的文章...http://blogs.msdn.com/b/knom/archive/2007/10/31/wpf-control-development-3-ways-to-build-an-imagebutton.aspx - PGallagher
这个链接很好!谢谢!但是它使用的是C#代码,而不是完整的XAML :-( - Walter Fabio Simoni
3
在你的帖子中没有指定只使用XAML,并且你在问题标记中添加了C#,因此你不应该评论链接不是你想要的。创建依赖属性来处理图像源和文本内容是使用MVVM进行数据绑定的首选方法。 - evanb
2个回答

12

如果您不需要使用额外的标签功能(例如目标、对象内容),那么TextBlock比Label更适合您的需求。

如果您想要禁用所有按钮样式,并且按钮中只有图像和标签(请注意,这会使鼠标悬停/按下效果失效,但您可以在触发器中提供逻辑):

<ControlTemplate TargetType="{x:Type Button}" x:Key="SimpleButton">
    <ContentPresenter/>
</ControlTemplate>

使用方法:

<Button Template="{StaticResource SimpleButton}"> 
    <StackPanel Orientation="Horizontal">
        <Image Source="ToolBar_FicJoints.png" />
        <TextBlock Text="LabelText" />
    </StackPanel>
</Button>

如果您只想在普通样式的按钮中使用图像/文本块,那就更容易了:
<Button> 
    <StackPanel Orientation="Horizontal">
        <Image Source="ToolBar_FicJoints.png" />
        <TextBlock Text="Fichiers joints" />
    </StackPanel>
</Button>

1
我尝试过,但我的文本框显示在按钮外面,你有什么想法吗?我用TxtBoxMedthod编辑了我的第一篇帖子 :) 非常感谢! - Walter Fabio Simoni

3
使用canvas如下。
<Button Height="50" Width="150" >
                        <Button.Template>
                            <ControlTemplate>
                                <Canvas>
                                    <Image Source="./Images/Cancel.png"/>
                                    <TextBlock Canvas.Left="22" Canvas.Top="8" Text="Cancel" FontFamily="Arial" FontSize="18"/>
                                </Canvas>
                            </ControlTemplate>
                        </Button.Template>
                     </Button>

你可以根据自己的需求调整Canvas.LeftCanvas.Top。我希望这个能够帮助你,因为它将在图像上方显示Textblock。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接