Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF自定义装饰器中使用线条排列拇指_C#_Wpf_Drawing_Adorner - Fatal编程技术网

C# 如何在WPF自定义装饰器中使用线条排列拇指

C# 如何在WPF自定义装饰器中使用线条排列拇指,c#,wpf,drawing,adorner,C#,Wpf,Drawing,Adorner,我正在使用WPF为绘图程序中的一条线制作装饰器。线在代码后面绘制,然后用名为LineAdorner的自定义装饰器装饰。我已经设法使用拇指作为行的起点和终点。我的问题是关于起点和终点的拇指排列。我认为问题在于方法ArrangeOverride,其中应该将拇指与起点和终点一起排列。我在RectX和Y参数中找不到合适的减法或加法量。如何找到这些值以始终将拇指与直线的点排列? 我的自定义装饰器中的代码如下: 在您的ArrangeOverride中尝试此操作。您可以去掉“开始”和“结束”变量,并且不需要

我正在使用WPF为绘图程序中的一条线制作装饰器。线在代码后面绘制,然后用名为
LineAdorner的自定义装饰器装饰。我已经设法使用
拇指
作为行的起点和终点。我的问题是关于起点和终点的拇指排列。我认为问题在于方法
ArrangeOverride
,其中应该将拇指与起点和终点一起排列。我在
Rect
X
Y
参数中找不到合适的减法或加法量。如何找到这些值以始终将拇指与直线的点排列? 我的自定义装饰器中的代码如下:


在您的ArrangeOverride中尝试此操作。您可以去掉“开始”和“结束”变量,并且不需要重写OnRender,因为如果您告诉拇指需要在哪里,拇指会自动渲染

    protected override Size ArrangeOverride(Size finalSize)
{
    selectedLine = AdornedElement as Line;

    double left = Math.Min(selectedLine.X1, selectedLine.X2);
    double top = Math.Min(selectedLine.Y1, selectedLine.Y2);

    var startRect = new Rect(selectedLine.X1 - (startThumb.Width / 2), selectedLine.Y1 - (startThumb.Width / 2), startThumb.Width, startThumb.Height);
    startThumb.Arrange(startRect);

    var endRect = new Rect(selectedLine.X2 - (endThumb.Width / 2), selectedLine.Y2 - (endThumb.Height / 2), endThumb.Width, endThumb.Height);
    endThumb.Arrange(endRect);

    return finalSize;
}
您正在设置拇指的显式大小,因此必须在排列中保持该大小。此外,还需要减去拇指宽度和高度的一半,以使其位于端点的中心


由于画布和形状的性质,您需要减去线条的“真实”左侧和顶部值,因为与线条不同,装饰者不会从画布的左上方绘制自己。除了使用画布之外,不应该要求这样做。

效果非常好,感谢您的帮助这正是我要找的。
    protected override Size ArrangeOverride(Size finalSize)
{
    selectedLine = AdornedElement as Line;

    double left = Math.Min(selectedLine.X1, selectedLine.X2);
    double top = Math.Min(selectedLine.Y1, selectedLine.Y2);

    var startRect = new Rect(selectedLine.X1 - (startThumb.Width / 2), selectedLine.Y1 - (startThumb.Width / 2), startThumb.Width, startThumb.Height);
    startThumb.Arrange(startRect);

    var endRect = new Rect(selectedLine.X2 - (endThumb.Width / 2), selectedLine.Y2 - (endThumb.Height / 2), endThumb.Width, endThumb.Height);
    endThumb.Arrange(endRect);

    return finalSize;
}