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中使用它们。