【问题标题】:Binding Style template - a way that works?绑定样式模板 - 一种有效的方式?
【发布时间】:2011-06-04 02:53:58
【问题描述】:

我一直在尝试(失败)创建一个按钮模板,以便在库之间共享。该模板(目前)基本上是一个有边框的圆圈内的有边框的圆圈。为了使内边框的尺寸小于外边框,我在装订上使用了转换器。我想将 TemplatedParent 的属性作为 ConverterParameter 传递,但它显然不起作用,显然是设计使然。不起作用的位是因为我正在尝试将 ConveterParameter 绑定到 TemplatedParent 属性。

这是我的样式定义(在 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 的 Height 使用 StaticResource 工作,但 Width 不能使用 TemplateBinding 方法工作。我也试过了

ConverterParameter={Binding Path=BorderThickness,RelativeSource={RelativeSource TemplatedParent}}

知道如何实现我的目标吗?!?

感谢您的帮助,

【问题讨论】:

    标签: wpf xaml binding


    【解决方案1】:

    这不起作用,因为要为值提供绑定表达式,该值必须是依赖属性。 ConverterParameter 不是依赖属性,所以不能绑定它的值。

    如何使用稍微不那么通用的方法,在其中创建一些稍微更具体的值转换器。然后,您可以使用“点”路径,以便将您的 Button 作为值传递给转换器,然后您可以直接访问宽度、边框宽度等。

      Width="{Binding Path=.,
                            RelativeSource={RelativeSource TemplatedParent}, 
                            Converter={StaticResource RelativeWidthWidthBorderSizeConverter}}"
    

    【讨论】:

    • 太棒了——我采纳了你的建议,并把它改成了稍微通用的——按照你的建议在按钮本身上使用转换器,然后将所需的属性作为 ConverterParameter(例如“BorderedWidth”) .所以 Width 和 Height 看起来像这样:
    • Height="{Binding Path=., RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource ButtonPropertyConverter}, ConverterParameter=BorderedHeight}" Width="{Binding Path=., RelativeSource={RelativeSource TemplatedParent} }, Converter={StaticResource ButtonPropertyConverter}, ConverterParameter=BorderedWidth}" />
    • 酷 - 如果您对回复感到满意,请标记为答案 :-)
    【解决方案2】:

    你不需要在这里做任何花哨的事情;布局系统将为您处理它(使用 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 合同失效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 2015-10-12
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 2016-08-17
      相关资源
      最近更新 更多