C# wpf中的按钮模板有问题。。?

C# wpf中的按钮模板有问题。。?,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我对wpf很陌生。我想在buttoncontrol中显示图像和文本块。因此,我创建了一个模板,并将图像绑定到源,将textblock绑定到名称 <ControlTemplate x:Key="ButtonControlTemplate1" TargetType="{x:Type Button}"> <ControlTemplate.Resources> <Storyboard x:Key="Storyboard1">

我对wpf很陌生。我想在buttoncontrol中显示图像和文本块。因此,我创建了一个模板,并将图像绑定到源,将textblock绑定到名称

<ControlTemplate x:Key="ButtonControlTemplate1" TargetType="{x:Type Button}">
        <ControlTemplate.Resources>
            <Storyboard x:Key="Storyboard1">
                <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" Storyboard.TargetName="border">
                    <EasingThicknessKeyFrame KeyTime="0:0:0.1" Value="1"/>
                    <EasingThicknessKeyFrame KeyTime="0:0:0.2" Value="0"/>
                </ThicknessAnimationUsingKeyFrames>
            </Storyboard>
        </ControlTemplate.Resources>
        <Border x:Name="border" BorderBrush="Black" BorderThickness="0" Margin="0,0,-96,-21">
            <Grid>
                <Image HorizontalAlignment="Left" Margin="8,8,0,8" Width="34" Source="{Binding Source}"/>
                <TextBlock Margin="46,8,8,8" TextWrapping="Wrap" Text="{Binding Name}" FontSize="16" Foreground="Black"/>
            </Grid>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsPressed" Value="True">
                <Trigger.ExitActions>
                    <StopStoryboard BeginStoryboardName="Storyboard1_BeginStoryboard"/>
                </Trigger.ExitActions>
                <Trigger.EnterActions>
                    <BeginStoryboard x:Name="Storyboard1_BeginStoryboard" Storyboard="{StaticResource Storyboard1}"/>
                </Trigger.EnterActions>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
ToolButton类

class ToolButton
{
    public string Source { get; set; }
    public string Name { get; set; }
}
当我兴奋地执行程序时,我一点也没有按下按钮。。。!!! 那么问题是什么。。?如何使用此模板

多谢各位
事先

我想你需要这样的东西:

<Button>
  <StackPanel>
    <Ellipse Height="40" Width="40" Fill="Blue"/>
    <TextBlock TextAlignment="Center">Button</TextBlock>
  </StackPanel>
</Button>

按钮


您可以将StackPanel替换为网格或DockPanel,并在此容器中嵌入所需的任何控件。

我认为,为了正确处理您必须使用的标准控件的自定义,该控件具有所需按钮的
样式


例如,看这里:

您是否将此模板设置为您的按钮?您必须设置它,因为您为您的
ControlTemplate
指定了一个名称,这使得它非常明确。如果没有名称,它将是隐式的,因此将自动使用

所以


在你的例子中,我想指出更多的事情。您可以在按钮中将
内容设置为类
工具按钮的实例,这很好。这个类显然不是WPF ui控件,因此您必须告诉WPF如何处理它。这是一个
DataTemplate
,您为ToolButton类定义了一个DataTemplate,现在WPF知道如何显示这个

不幸的是,您的按钮
模板中还有另一个问题。按钮的类型为
ContentControl
,因此允许它显示任何内容。您已经使用了
内容
属性。但是您完全覆盖了ControlTemplate,请记住ControlTemplate定义了控件的外观,如果没有它的模板,它将完全不显示任何内容。 现在看一下您的模板,我错过了一个名为
ContentPresenter
的专门控件,它告诉模板“当按钮有内容时,将其放置在此处”,因此ContentPresenter是实际设置内容的占位符。现在请记住我所说的
DataTemplate
,您将看到这些东西是如何协同工作的

另一件小事是,您在模板中使用绑定,但从未设置DataContext—您只是设置了内容,但内容仅在ContentPresenter中有效,或者更好地说,在DataTemplate中有效。围绕DataContext有几个“规则”。快速总结:DataContext可以继承,并在
数据模板中自动设置

我希望这对你有点帮助。
干杯。

假设您已使用下面的控件模板设置了按钮

    <Button Template="{StaticResource ButtonControlTemplate1}"/>
尽管我必须坚持要求您通过总是需要“特定”数据上下文的
ControlTemplate
来改变显示文本和图像的方式,即
ToolButton

控制模板和数据绑定、数据模板和用户操作效果永远不能混合在一起


:-)

如果我应用该模板,上述操作将不起作用。或者你想让我删除模板并使用单个按钮进行设计,如果我知道它可以工作的话。你不需要任何模板设置。如果你需要在按钮中包含文本块和图像,那么这是最简单的解决方案,但是,如果您需要一个具有文本块的图像,它的工作方式类似于按钮,那么您必须使用模板或ContentPresenter。但是如何同时显示图像和相关文本。您可以将样式应用于ContentPresenter,在该样式内定义所需的控件。请看提供的示例。我在几年前就做过类似的事情,而且效果很好。你不应该明确地设置模板,因为有TargetType=“{x:Type Button}”,它会将此模板设置为每个按钮使用的类型,就像它将应用于单个按钮而不是所有按钮一样。@Amittai Shapira考虑到你评论了我的帖子,我想你是指我。因为我不太明白你的意思。您可以显式或隐式地设置模板,这就是我在回答的第一部分中所说的。因为线程启动者在他的模板中使用了一个名称,所以我想指出,他的ControlTemplate必须在他想要使用该模板的每个按钮上显式设置。TargetType与模板的隐式或显式查找无关,这取决于名称。您是如何“将此模板应用于按钮”的?包含按钮的控件的实际XAML代码在哪里?是的,我像您之前所说的那样设置了模板。但是我没有设置数据上下文。这很有效。谢谢。
<Button Template="{StaticResource ButtonControlTemplate1}"/>
    <Button Template="{StaticResource ButtonControlTemplate1}"/>
     btnAddGropu.DataContext
       = new ToolButton() { Source = "Icons/add.png", Name = "Add Group" };