【发布时间】:2017-01-20 20:05:16
【问题描述】:
我有一个包含 ControlTemplate 的 Button 基本样式,然后我想创建一些样式,这些样式只为常用的内容设置内容,如“确定”、“取消”等。
在这些样式中,我有一个图像后跟一些文本,我想将图像的高度绑定到文本的高度,所以我有以下内容:
<Style x:Key="OkayButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource RoundedButtonStyle}">
<Setter Property="Content">
<Setter.Value>
<Grid HorizontalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Image Grid.Column="0" Source="{DynamicResource OkayIcon}" Height="{Binding ActualHeight, ElementName=ButtonText}"/>
<TextBlock x:Name="ButtonText" Grid.Column="1" Margin="5,0,0,0" Text="Okay"/>
</Grid>
</Setter.Value>
</Setter>
</Style>
这样做会给我错误:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=ButtonText'. BindingExpression:Path=ActualHeight; DataItem=null; target element is 'Image' (Name=''); target property is 'Height' (type 'Double')
我猜它试图在 ControlTemplate 中找到它显然无法找到的 ButtonText。有没有办法完成我在这里尝试做的事情并从这个样式设置器中绑定到另一个元素的属性?
【问题讨论】:
-
不确定,但是一旦您开始工作,您将遇到第二个问题:该网格只有一个实例。如果您有多个 OkayButtons,则只有最后创建的一个会获得内容。要解决此问题,内容必须是具有自己的密钥的单独资源,具有
x:Shared="False"属性。 -
我希望它可以工作,很奇怪。您是否尝试过使用类似的绑定:“{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Path=Children[1].ActualHeight}”以防万一
标签: wpf