绑定样式模板 - 一种有效的方式?

时间:2011-01-05 16:03:10

标签: wpf xaml binding

我一直在尝试(失败)创建一个按钮模板,以便在库之间共享。模板(当前)基本上是带边圆内的有边界圆。为了使内边框的尺寸小于外边框,我在绑定上使用了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}}

任何想法如何实现我的目标?!?

感谢您的帮助,

2 个答案:

答案 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合约。