获取模板中内容的实际大小以绘制不规则形状的按钮

时间:2019-02-16 08:05:15

标签: wpf

我想创建一个看起来像粘贴在窗口左侧的标签寄存器的按钮。

我想出了第一次尝试:

<Style x:Key="ButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="Gray" />
    <Setter Property="HorizontalAlignment" Value="Center" />
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid>
                    <Path Fill="{TemplateBinding Background}" Data="M 0,0 C 0,25 50,25 50,50 V 150 C 50,175 0,175 0,200 Z" />
                    <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这是使用此样式的按钮:

<Button VerticalAlignment="Center" Style="{StaticResource ButtonStyle}">
    <TextBlock Text="Content">
        <TextBlock.LayoutTransform>
            <RotateTransform Angle="90" />
        </TextBlock.LayoutTransform>
    </TextBlock>
</Button>

但是第一次尝试的大小是一种修复(取决于我在Data对象的Path属性中使用的修复值。)我想使用“真实”按钮内容的大小,作为Data对象的Path属性的度量。

我知道我必须将以前使用的路径标记更改为代表实际路径图形的“真实”对象,然后我猜我必须在正确的位置使用某种TemplateBinding。但是,我必须从何处获取模板绑定的值?那个告诉我内容的实际大小吗?

1 个答案:

答案 0 :(得分:0)

经过反复试验,我找到了一种方法。

由于没有可以绑定的ActualSize属性,并且由于RenderSize不起作用,我不得不使用MultiBinding绑定到ActualWidth和{{1} }。

并且由于一个人只能绑定到ActualHeight的{​​{1}},而不能仅绑定到属性Point1,因此我必须在{ {1}}来计算BezierSegment的所有点以适合X的{​​{1}}和IMultiValueConverter