我一直在尝试(失败)创建一个按钮模板,以便在库之间共享。模板(当前)基本上是带边圆内的有边界圆。为了使内边框的尺寸小于外边框,我在绑定上使用了Converter。我想将TemplatedParent的属性作为ConverterParameter传递,但它显然不起作用,显然是设计的。不起作用的是因为我正在尝试将ConveterParameter绑定到TemplatedParent属性。
这是我的Style def(在ResourceDictionary中):
<SolidColorBrush x:Key="MyBorderFillColour">Yellow</SolidColorBrush>
<SolidColorBrush x:Key="MyBorderEdgeColour">#ff652f00</SolidColorBrush>
<SolidColorBrush x:Key="MyGeneralFillColour">#ffffffbd</SolidColorBrush>
<s:Int32 x:Key="MyBorderThickness">10</s:Int32>
<l:RelativeSizeConverter x:Key="RelativeSizeConverter" />
<Style x:Key="MyButtonStyle" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Ellipse
Fill="{StaticResource MyBorderFillColour}"
StrokeThickness="2"
Stroke="{StaticResource MyBorderEdgeColour}"
Height="{TemplateBinding Height}"
Width="{TemplateBinding Width}" />
<Ellipse StrokeThickness="2"
Stroke="{StaticResource MyBorderEdgeColour}"
Fill="{StaticResource MyGeneralFillColour}"
Height="{Binding Path=Height,
RelativeSource={RelativeSource TemplatedParent},
Converter={StaticResource RelativeSizeConverter},
ConverterParameter={StaticResource MyBorderThickness}}"
Width="{Binding Path=Width,
RelativeSource={RelativeSource TemplatedParent},
Converter={StaticResource RelativeSizeConverter},
ConverterParameter={TemplateBinding BorderThickness}}" />
<TextBlock
Text="{TemplateBinding Content}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="Black"
FontFamily="Calibri"
FontWeight="Bold"
FontSize="17" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
第二个Ellipse的高度使用StaticResource,但Width不能使用TemplateBinding方法。我也试过了
ConverterParameter={Binding Path=BorderThickness,RelativeSource={RelativeSource TemplatedParent}}
任何想法如何实现我的目标?!?
感谢您的帮助,
答案 0 :(得分:0)
这不起作用,因为为了为值提供绑定表达式,该值必须是依赖项属性。 ConverterParameter不是依赖项属性,因此您无法绑定其值。
如何使用稍微不那么通用的方法,在其中创建一些稍微更具体的值转换器。然后,您可以使用“点”路径,以便将Button作为值传递给转换器,然后可以直接访问宽度,边框宽度等。
Width="{Binding Path=.,
RelativeSource={RelativeSource TemplatedParent},
Converter={StaticResource RelativeWidthWidthBorderSizeConverter}}"
答案 1 :(得分:0)
你不需要在这里做任何事情;布局系统将为您处理它(使用Margin属性和容器中Ellipse的拉伸行为):
<Grid Height="{TemplateBinding Height}" Width="{TemplateBinding Width}">
<Ellipse
Fill="{StaticResource MyBorderFillColour}"
StrokeThickness="2"
Stroke="{StaticResource MyBorderEdgeColour}"/>
<Ellipse StrokeThickness="2" Margin="4"
Stroke="{StaticResource MyBorderEdgeColour}"
Fill="{StaticResource MyGeneralFillColour}"/>
<TextBlock
Text="{TemplateBinding Content}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="Black"
FontFamily="Calibri"
FontWeight="Bold"
FontSize="17" />
</Grid>
另请注意,您应该使用ContentPresenter作为内容而不是TextBlock以获得更大的灵活性;如果模板化按钮的用户提供更复杂的内容,则目前这不符合Button合约。