Wpf 在ControlTemplate中基于高度/宽度绘制直线
这是一个更具体的后续问题: 我正在尝试制作一个Wpf 在ControlTemplate中基于高度/宽度绘制直线,wpf,wpf-controls,Wpf,Wpf Controls,这是一个更具体的后续问题: 我正在尝试制作一个控制模板,以复制原始问题中显示的外观。外部边框由6行组成,其坐标需要取决于应用模板的按钮的高度和宽度。一些坐标将是总坐标的百分比,其他坐标需要是静态偏移 将X1、Y1等绑定到这些属性的语法是什么 或者,如果有更好的方法来绘制6边形状作为边界,仍然允许依赖于高度和宽度,我也愿意这样做 这是我使用GDI生成绘图点的原始代码: int DiagonalOffset = 15; List<Point> pts = new Li
控制模板
,以复制原始问题中显示的外观。外部边框由6行组成,其坐标需要取决于应用模板的按钮的高度和宽度。一些坐标将是总坐标的百分比,其他坐标需要是静态偏移
将X1、Y1等绑定到这些属性的语法是什么
或者,如果有更好的方法来绘制6边形状作为边界,仍然允许依赖于高度和宽度,我也愿意这样做
这是我使用GDI生成绘图点的原始代码:
int DiagonalOffset = 15;
List<Point> pts = new List<Point>();
pts.Add(new Point(offset, this.Height - offset));
pts.Add(new Point(offset, DiagonalOffset));
pts.Add(new Point(DiagonalOffset, offset));
pts.Add(new Point(this.Width - offset, offset));
pts.Add(new Point(this.Width - offset, this.Height - DiagonalOffset));
pts.Add(new Point(this.Width - DiagonalOffset, this.Height - offset));
pts.Add(new Point(offset, this.Height - offset));
int对角线偏移=15;
List pts=新列表();
添加(新点(偏移,此高度-偏移));
增加(新点(偏移、对角线偏移));
增加(新点(对角线偏移,偏移));
添加(新点(此宽度-偏移,偏移));
添加(新点(此.宽度-偏移,此.高度-对角线偏移));
添加(新点(此.宽度-对角线偏移,此.高度-偏移));
添加(新点(偏移,此高度-偏移));
我需要在我的ControlTemplate中执行与此等效的操作。您应该能够使用
TemplatedParent RelativeSource绑定应用ControlTemplate
的控件的实际宽度和实际高度属性进行数据绑定。尝试以下示例,它将在应用ControlTemplate
的控件上沿对角线绘制一条线
:
<ControlTemplate>
<Line X1="0.0" X2="{Binding ActualWidth, RelativeSource={RelativeSource
TemplatedParent}}" Y1="0" Y2="{Binding ActualHeight, RelativeSource={
RelativeSource TemplatedParent}}" Stroke="Black" StrokeThickness="5" />
</ControlTemplate>
您应该能够使用TemplatedParent RelativeSource绑定将ControlTemplate
应用到的控件的ActualWidth
和ActualHeight
属性进行数据绑定。尝试以下示例,它将在应用ControlTemplate
的控件上沿对角线绘制一条线
:
<ControlTemplate>
<Line X1="0.0" X2="{Binding ActualWidth, RelativeSource={RelativeSource
TemplatedParent}}" Y1="0" Y2="{Binding ActualHeight, RelativeSource={
RelativeSource TemplatedParent}}" Stroke="Black" StrokeThickness="5" />
</ControlTemplate>
我只需要使用一个路径,并允许它拉伸到容器大小(例如网格)。因此,在ControlTemplate中可以有如下内容:
<ControlTemplate>
<Grid Background="LightGray">
<Path Data="M 0,2 L 2,0 L 10,0 L 10,8 L 8,10 L 0,10 Z"
Stretch="Fill"
Stroke="Black" StrokeThickness="1"
Margin="1"
/>
</Grid>
</ControlTemplate>
路径使用,所以您可以将其绘制为您喜欢的任何比例,并且它将调整大小
我只需要使用一个路径,并允许它拉伸到容器大小(例如网格)。因此,在ControlTemplate中可以有如下内容:
<ControlTemplate>
<Grid Background="LightGray">
<Path Data="M 0,2 L 2,0 L 10,0 L 10,8 L 8,10 L 0,10 Z"
Stretch="Fill"
Stroke="Black" StrokeThickness="1"
Margin="1"
/>
</Grid>
</ControlTemplate>
路径使用,所以您可以将其绘制为您喜欢的任何比例,并且它将调整大小
如果控件在初始加载后重新调整大小,这是否仍然有效?@Sheridan谢谢,这与我要查找的非常接近。在将实际高度/实际宽度用作坐标(或等效坐标)之前,如何将其减去或相加?正如你所看到的,我需要能够抵消。这是一个绑定
,所以是的。。。当特性值更改时,行
坐标将更改。在将实际高度/实际宽度用作坐标(或等效坐标)之前,如何对其进行减法或相加?。。。你需要创建一个,但那是另一个故事。绑定到实际宽度
/实际高度
对我来说总是很危险——但我使用Silverlight,所以可能WPF更好。绑定到实际宽度
/实际高度
对我来说总是很危险。。。它只是将绑定到双属性。我从来没有遇到过任何问题,即使是在非常高级的自定义控件中,在IMultiValueConverter
s和imultibling
s中使用它们。如果控件在初始加载后重新调整大小,这仍然有效吗?@Sheridan谢谢,这与我正在寻找的非常接近。在将实际高度/实际宽度用作坐标(或等效坐标)之前,如何将其减去或相加?正如你所看到的,我需要能够抵消。这是一个绑定
,所以是的。。。当特性值更改时,行
坐标将更改。在将实际高度/实际宽度用作坐标(或等效坐标)之前,如何对其进行减法或相加?。。。你需要创建一个,但那是另一个故事。绑定到实际宽度
/实际高度
对我来说总是很危险——但我使用Silverlight,所以可能WPF更好。绑定到实际宽度
/实际高度
对我来说总是很危险。。。它只是将绑定到双属性。我从来没有遇到过任何问题,即使是在非常高级的自定义控件中,在IMultiValueConverter
s和IMultiBinding
s中使用它们。