我在树视图上实现了一些拖放功能。
我试图绘制插入点标记,但它模糊不清:
如何让它呈现清晰锐利?
这是我的模板:
.ToList()
这是我的渲染逻辑:
<HierarchicalDataTemplate DataType="{x:Type localvm:TreeViewItemViewModel}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}">
<i:Interaction.Behaviors>
<b:TreeViewItemDragBehavior/>
<b:TreeViewItemDropBehavior/>
</i:Interaction.Behaviors>
</TextBlock>
我在装饰构造函数中一直在玩protected override void OnRender(DrawingContext drawingContext)
{
Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);
SolidColorBrush renderBrush = new SolidColorBrush(Colors.Blue);
renderBrush.Opacity = 0.5;
Pen renderPen = new Pen(new SolidColorBrush(Colors.Blue), 1.5);
if (IsInUpperHalf)
{
drawingContext.DrawLine(renderPen, adornedElementRect.TopLeft, adornedElementRect.TopRight);
Point point1 = new Point(adornedElementRect.TopLeft.X + 10, adornedElementRect.TopLeft.Y);
Point point2 = new Point(adornedElementRect.TopLeft.X, adornedElementRect.TopLeft.Y + 3);
StreamGeometry leftStreamGeometry = new StreamGeometry();
using (StreamGeometryContext geometryContext = leftStreamGeometry.Open())
{
geometryContext.BeginFigure(adornedElementRect.TopLeft, true, true);
PointCollection points = new PointCollection { point1, point2 };
geometryContext.PolyLineTo(points, true, true);
drawingContext.DrawGeometry(Brushes.Blue, new Pen(Brushes.Blue, 1), leftStreamGeometry);
}
StreamGeometry rightStreamGeometry = new StreamGeometry();
using (StreamGeometryContext geometryContext = rightStreamGeometry.Open())
{
geometryContext.BeginFigure(adornedElementRect.TopRight, true, true);
PointCollection points = new PointCollection { point3, point4 };
geometryContext.PolyLineTo(points, true, true);
drawingContext.DrawGeometry(Brushes.Blue, new Pen(Brushes.Blue, 1), rightStreamGeometry);
}
}
}
和UseLayoutRounding
,但似乎我错过了一些东西。
答案 0 :(得分:1)
在Brian的指导和一些修补之后,这似乎解决了这个问题。在Brian的评论之后,我一直存在的主要问题是指导线需要半个笔宽才能让他们工作。我只是通过搜索示例找到了这个,但没有在MSDN上提示。这是我的功能代码:
protected override void OnRender(DrawingContext drawingContext)
{
Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);
Pen renderPen = new Pen(new SolidColorBrush(Colors.Blue), 1);
double halfPenWidth = renderPen.Thickness / 2;
GuidelineSet guidelines = new GuidelineSet();
guidelines.GuidelinesX.Add(adornedElementRect.TopLeft.X + halfPenWidth);
guidelines.GuidelinesX.Add(adornedElementRect.BottomRight.X + halfPenWidth);
guidelines.GuidelinesY.Add(adornedElementRect.TopLeft.Y + halfPenWidth);
guidelines.GuidelinesY.Add(adornedElementRect.BottomRight.Y + halfPenWidth);
drawingContext.PushGuidelineSet(guidelines);
if (IsInUpperHalf)
{
drawingContext.DrawLine(renderPen, adornedElementRect.TopLeft, adornedElementRect.TopRight);
StreamGeometry leftStreamGeometry = new StreamGeometry();
using (StreamGeometryContext geometryContext = leftStreamGeometry.Open())
{
geometryContext.BeginFigure(adornedElementRect.TopLeft, true, true);
geometryContext.LineTo(new Point(adornedElementRect.TopLeft.X + 10, adornedElementRect.TopLeft.Y), false, false);
geometryContext.LineTo(new Point(adornedElementRect.TopLeft.X, adornedElementRect.TopLeft.Y + 3), false, false);
drawingContext.DrawGeometry(Brushes.Blue, new Pen(Brushes.Blue, 1), leftStreamGeometry);
}
StreamGeometry rigthStreamGeometry = new StreamGeometry();
using (StreamGeometryContext geometryContext = rigthStreamGeometry.Open())
{
geometryContext.BeginFigure(adornedElementRect.TopRight, true, true);
geometryContext.LineTo(new Point(adornedElementRect.TopRight.X, adornedElementRect.TopRight.Y + 3), false, false);
geometryContext.LineTo(new Point(adornedElementRect.TopRight.X - 10, adornedElementRect.TopRight.Y), false, false);
drawingContext.DrawGeometry(Brushes.Blue, new Pen(Brushes.Blue, 1), rigthStreamGeometry);
}
}
}