我使用this MSDN tutorial为我窗口的所有Button
控件创建一个眼睛糖果外观,并且运行正常。
为了使其更具可重用性,我尝试将所有内容放入UserControl中:我创建了一个ImageButton UC,然后将<Style>
中的所有<Window.Resources>
封装到<UserControl.Resources>
。
然后我在XAML中更改了我的Button实例,来自:
<Button Tag="Face.jpg" Content="Foo" />
要:
<uc:ImageButton Tag="Face.jpg" Content="Foo" />
风格停止应用。
这是UC代码:
<UserControl x:Class="GDTI.UI.Main.View.UserControls.ImageButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<Style TargetType="Button">
<Setter Property="MaxWidth" Value="250" />
<Setter Property="Margin" Value="5" />
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Foreground" Value="White" />
<Setter Property="Background" >
<Setter.Value>
<SolidColorBrush Color="Orange" Opacity="0.4" />
</Setter.Value>
</Setter>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate >
<StackPanel>
<Image Source="{Binding Tag,
RelativeSource={RelativeSource
FindAncestor,
AncestorType='Button'}}" />
<TextBlock Margin="10"
HorizontalAlignment="Center"
Text="{Binding Content,
RelativeSource={RelativeSource
FindAncestor,
AncestorType='Button'}}" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Button/>
我错过了什么?
谢谢!
答案 0 :(得分:0)
按钮上按钮式目标属性中的绑定,不再设置属性。如果你想保留风格的完整性,你需要将它们转发到UserControl
:
<!-- Inside UserControl declaration -->
<Button Content="{Binding Caption, RelativeSource={RelativeSource AncestorType=UserControl}}"
Tag="{Binding ImageSource, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
在UserControl上定义Caption
和ImageSource
应该是新的dependency properties(在代码隐藏中)。
请注意,您永远不能绑定到Content
中的UserControl
(因此Caption
属性),此处Button
本身 Content
的{{1}}。
或者,您可以通过将UserControl
更改为AncestorType
来绕过UserControl
,直接更改样式中的定位。超出模板控制的绑定并不是很好的练习,但你仍然在Button
内,所以它可能是可以原谅的。
无论哪种方式,这都有点hacky而且从UserControl
继承可能更好。