wpf中的按钮模板有问题..?

时间:2011-09-15 13:02:50

标签: c# wpf wpf-controls

我对wpf很新。我想在buttoncontrol中显示图像和文本块。因此,我创建了一个模板和绑定图像到源和文本块以命名。

<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>

然后我将此模板应用于按钮。我尝试通过窗口加载事件添加内容。

btnAddGropu.Content = new ToolButton() { Source = "Icons/add.png", Name = "Add Group" };

ToolButton类

class ToolButton
{
    public string Source { get; set; }
    public string Name { get; set; }
}

当我兴奋地执行程序时,我根本没有得到按钮...... !!! 所以有什么问题..?我如何使用这个模板..?

谢谢 提前

4 个答案:

答案 0 :(得分:2)

假设您已使用控件模板设置按钮,如下所示...

    <Button Template="{StaticResource ButtonControlTemplate1}"/>

修复问题是设置按钮的DataContext而不是Content

     btnAddGropu.DataContext
       = new ToolButton() { Source = "Icons/add.png", Name = "Add Group" };

虽然我必须坚持要通过ControlTemplate来改变显示文字和图片的方式,ToolButton始终需要“特定的”DataContext,即{{1}}。

控件模板和数据绑定,DataTemplates和用户操作效果永远不会混合在一起。

: - )

答案 1 :(得分:0)

我认为你需要这样的东西:

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

MSDN

您可以使用Grid或DockPanel替换StackPanel,并在此容器中嵌入您想要的任何控件。

答案 2 :(得分:0)

我认为为了正确处理标准控件的自定义,您必须使用ContentPresenter,它具有您想要的Style按钮。

例如,请查看此处:Example

答案 3 :(得分:0)

您是否将此模板设置为按钮?您必须设置它,因为您为ControlTemplate提供了一个名称,这使其显式化。如果没有名称,它将是隐含的,因此它将被自动使用。

所以

<Button Template="{StaticResource ButtonControlTemplate1}"/>

我想在你的例子中指出更多的东西。您在按钮中设置了Content到您的班级ToolButton的实例,这很好。这个类显然不是WPF ui控件,因此你必须告诉WPF如何处理它。这是一个DataTemplate,你为你的ToolButton类定义一个DataTemplate,现在WPF知道如何显示这个。

不幸的是,按钮Template还有另一个问题。按钮的类型为ContentControl,因此可以显示任何内容。您已使用Content属性。但是你完全重写了ControlTemplate,记住ControlTemplate定义了控件的外观,没有它的模板,它完全没有显示任何内容。 现在查看你的模板我想念一个名为ContentPresenter的专用控件,它告诉模板“当按钮有内容时,将其放在这里”,以便ContentPresenter是实际设置内容的占位符。现在记住我对DataTemplate所说的内容,你会看到这些东西是如何协同工作的。

另一个小问题是,你在模板中使用Bindings,但是你从未设置DataContext只是设置了内容,但内容只在ContentPresenter中有效,或者更好,在你的DataTemplate中。 DataContext有一些“规则”。快速总结:DataContext可以继承,并自动设置为DataTemplate

我希望这可以帮助你升职。 欢呼声。