2015-03-20 4 views
0

Я использую DrawingBrush, чтобы показать маркер перетаскивания - пунктирная линия.wpf. Легкий способ скрыть переполнение кисти плитки

<Rectangle Height="19" Width="7"> 
    <Rectangle.Fill> 
     <DrawingBrush TileMode="Tile" 
         Viewbox="0,0,2,2" 
         Viewport="0,0,4,4" 
         ViewportUnits="Absolute" 
         ViewboxUnits="RelativeToBoundingBox"> 
      <DrawingBrush.Drawing> 
       <DrawingGroup> 
        <GeometryDrawing Brush="#FF6D6D6D"> 
         <GeometryDrawing.Geometry> 
          <EllipseGeometry Center="1,1" 
              RadiusX="1" 
              RadiusY="1" /> 
         </GeometryDrawing.Geometry> 
        </GeometryDrawing> 
       </DrawingGroup> 
      </DrawingBrush.Drawing> 
     </DrawingBrush> 
    </Rectangle.Fill> 
</Rectangle> 

Проблема - не может использовать его с Height=auto, дот-плитка может быть нарезан:

enter image description here

Есть простой способ скрыть неполные плитки?

ответ

0

Вы можете достичь желаемого результата с помощью простого пользовательского FrameworkElement, который только привлекает полные круги, которые вписываются в ширину и высоту элемента:

public class DragMarker : FrameworkElement 
{ 
    public static readonly DependencyProperty ForegroundProperty = 
     Control.ForegroundProperty.AddOwner(typeof(DragMarker)); 

    public Brush Foreground 
    { 
     get { return (Brush)GetValue(ForegroundProperty); } 
     set { SetValue(ForegroundProperty, value); } 
    } 

    protected override void OnRender(DrawingContext drawingContext) 
    { 
     for (int y = 0; y < (int)ActualHeight/4; y++) 
     { 
      for (int x = 0; x < (int)ActualWidth/4; x++) 
      { 
       drawingContext.DrawEllipse(Foreground, null, 
        new Point(x * 4 + 2, y * 4 + 2), 1, 1); 
      } 
     } 
    } 
}