我正在尝试创建自定义ControlTemplate并遇到问题。我正在绘制一系列PolyLines以创建边框效果,并且无法在Designer和运行时显示它。
为了绘制PolyLines,我需要控件的ActualHeight和ActualWidth来生成PointCollection。然而,绑定到DesiredSize和RenderSize会产生非常奇怪的结果。我第一次将Path更改为DesiredSize或RenderSize时,它在设计器中正确显示如下:
。但是,当我实际运行测试应用程序时,我得到的结果都被搞砸了:
并且转换器的大小为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;
}
答案 0 :(得分:0)
我在使用RenderSize方面遇到了问题,这是由于RenderSize没有依赖属性,因此值并没有自动更新。在我看来,有一些属性与其他属性不同是非常糟糕的API设计,但它是WPF,所以我想我们不应该感到惊讶。 在我的例子中,解决方案是使用ActualWidth和ActualHeight作为依赖属性。