在ControlTemplate中绑定RenderSize / DesiredSize会产生奇怪的行为

时间:2014-11-18 20:49:00

标签: c# wpf xaml

我正在尝试创建自定义ControlTemplate并遇到问题。我正在绘制一系列PolyLines以创建边框效果,并且无法在Designer和运行时显示它。

为了绘制PolyLines,我需要控件的ActualHeight和ActualWidth来生成PointCollection。然而,绑定到DesiredSize和RenderSize会产生非常奇怪的结果。我第一次将Path更改为DesiredSize或RenderSize时,它在设计器中正确显示如下:

enter image description here

。但是,当我实际运行测试应用程序时,我得到的结果都被搞砸了:

enter image description here

并且转换器的大小为0。

我的问题:发生了什么以及如何解决?

我的PolyLine XAML(除了ConverterParameter和Opacity更改之外,总共有6个完全相同):

<Polyline Stroke="{Binding Background, RelativeSource={RelativeSource TemplatedParent}}" Opacity="1"
            Points="{Binding Path=RenderSize, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource BConverter}, ConverterParameter=0 }">
</Polyline>

转换器代码:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    Size renderSize = (Size)value;
    double ActualHeight = renderSize.Height;
    double ActualWidth = renderSize.Width;
    double DiagonalOffset = 10;
    double BaseOffset = 1;
    double AdditionalOffset = double.Parse(parameter.ToString());

    double Offset = BaseOffset + AdditionalOffset;

    PointCollection r = new PointCollection();

    r.Add(new Point(0 + Offset, ActualHeight - Offset));
    r.Add(new Point(0 + Offset, DiagonalOffset));
    r.Add(new Point(DiagonalOffset, 0 + Offset));
    r.Add(new Point(ActualWidth - Offset, 0 + Offset));
    r.Add(new Point(ActualWidth - 0.5 - Offset, ActualHeight - DiagonalOffset));
    r.Add(new Point(ActualWidth - DiagonalOffset, ActualHeight - 0.5 - Offset));
    r.Add(new Point(0 + Offset, ActualHeight - 0.5 - Offset));

    return r;
}

1 个答案:

答案 0 :(得分:0)

我在使用RenderSize方面遇到了问题,这是由于RenderSize没有依赖属性,因此值并没有自动更新。在我看来,有一些属性与其他属性不同是非常糟糕的API设计,但它是WPF,所以我想我们不应该感到惊讶。 在我的例子中,解决方案是使用ActualWidth和ActualHeight作为依赖属性。