2016-01-15 3 views
1

Я реализую некоторые функции перетаскивания на древовидной структуре.WPF размытый adorner

Я пытаюсь нарисовать точку маркеров вставки, но это выходит размыто:

enter image description here

Как я могу сделать это делает ровным и острым?

Это мой шаблон:

<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 и SnapToDevicePixels в конструкторе Adorner, но я, кажется, «Что-то не хватает.

+1

, пожалуйста, введите код метода OnRender –

+0

. Что вы думаете об этом? – Default

+0

Возможно, вам понадобится [DrawingContext.PushGuidelineSet] (https://msdn.microsoft.com/en-us/library/system.windows.media.drawingcontext.pushguidelineset%28v=vs.110%29.aspx) в [ выровняйте линию с пикселями устройства] (https://msdn.microsoft.com/fr-fr/library/aa970908%28v=vs.85%29.aspx#guidelines). –

ответ

1

С руководством Брайана и некоторых мастерингов это, похоже, исправить проблему. Основная проблема, с которой я столкнулся после комментария Брайана, заключалась в том, что для правильной работы требуется половина ширины пера. Я только нашел это, ища примеры, но не намекал на 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); 
      } 
     } 
    } 
+1

Извините, я думал, что я вспомнил, что видел половину ширины пера вещь обсуждается во второй линии и совершенно не проверить. –

Смежные вопросы