我对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; }
}
当我兴奋地执行程序时,我根本没有得到按钮...... !!! 所以有什么问题..?我如何使用这个模板..?
谢谢 提前
答案 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>
您可以使用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
。
我希望这可以帮助你升职。 欢呼声。