2013-06-11 2 views
2

WPF에서 정의 된 브러시의 방사형 스윕을 사용하여 무언가를 채울 방법을 찾고 있습니다. 나는 분명히하기 위해 일련의 이미지에서 내가 원하는 것을 무너 뜨릴 것이다.Radial Sweeping 브러시

Brush with Slice

그리고 타일 :

Brush

나는 다음과 같이 그 브러시의 조각을 사용하려면 :

의 내가 그렇게 보이는 WPF에서 브러쉬를 정의한다고 가정 해 봅시다 도시 된 바와 같이 원의 반경을 가로 질러 그려진다 :

Tiling the Radius

마지막으로, 모양을 채우기 위해, 나는이 유사한 결과를 나에게 제공하는 원의 모든 각도에서 브러시를 청소하고 싶습니다 :

Sweeping the Circle

이 특정 경우 I 동심원을 만들려고. RadialGradientBrush를 사용하여이 작업을 수행 할 수 있다는 것을 알았지 만 동심원의 너비를 정밀하게 제어하기 위해 원의 크기에 따라 방사형 정지 점의 수를 변경해야하는 불쾌한 해결책입니다. 반대로 원의 크기가 변경되면 원형 너비/높이를 기준으로 일종의 변환기를 사용하지 않으면 요골 정지가 변경되지 않습니다.

나는 경로 또는 무언가로 이것을 할 수있는 깨끗한 해결책을 원했지만 조절 된 크기의 원형 조각을 만들기위한 다른 제안은 환영합니다.

답변

1

브러시를 사용하여 몇 개의 동심원을 그리는 방법은 어떨까요? 동심원 케이스 대하여

<Rectangle> 
    <Rectangle.Fill> 
     <DrawingBrush Stretch="Uniform"> 
      <DrawingBrush.Drawing> 
       <GeometryDrawing> 
        <GeometryDrawing.Pen> 
         <Pen Brush="Black" Thickness="1"/> 
        </GeometryDrawing.Pen> 
        <GeometryDrawing.Geometry> 
         <GeometryGroup> 
          <EllipseGeometry RadiusX="1" RadiusY="1"/> 
          <EllipseGeometry RadiusX="3" RadiusY="3"/> 
          <EllipseGeometry RadiusX="5" RadiusY="5"/> 
          <EllipseGeometry RadiusX="7" RadiusY="7"/> 
          <EllipseGeometry RadiusX="9" RadiusY="9"/> 
          <EllipseGeometry RadiusX="11" RadiusY="11"/> 
         </GeometryGroup> 
        </GeometryDrawing.Geometry> 
       </GeometryDrawing> 
      </DrawingBrush.Drawing> 
     </DrawingBrush> 
    </Rectangle.Fill> 
</Rectangle> 
1

, 컨버터와 클레멘스의 용액을 조합하여 그 폭만큼 동적으로 변경 될 수 있으며, 원의 크기가 설정된 허용 영역에 맞는 정확한 크기의 원을 허용한다.

class SizeSpacingToCircleGroupConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (values == null) return values; 
     var input = values.OfType<double>().ToArray(); 
     if (input.Length != 3) return values; 

     var width = input[0]; 
     var height = input[1]; 
     var spacing = input[2]; 

     var halfSpacing = spacing/2; 
     var diameter = width > height ? height : width; 

     var lineCount = (int)Math.Floor((diameter/(2 * spacing)) - 1); 
     if (lineCount <= 0) return values; 

     var circles = Enumerable.Range(0, lineCount).Select(i => 
     { 
      var radius = halfSpacing + (i * spacing); 
      return new EllipseGeometry() { RadiusX = radius, RadiusY = radius }; 
     }).ToArray(); 

     var group = new GeometryGroup(); 
     foreach (var circle in circles) group.Children.Add(circle); 

     return group; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

그리고 XAML : 내 경우

<Rectangle Height="{StaticResource Diameter}" Width="{StaticResource Diameter}"> 
    <Rectangle.Fill> 
     <DrawingBrush Stretch="None"> 
      <DrawingBrush.Drawing> 
       <GeometryDrawing> 
        <GeometryDrawing.Pen> 
         <Pen Brush="{StaticResource ForegroundBrush}" Thickness="{StaticResource SpacingDiv2}"/> 
        </GeometryDrawing.Pen> 
        <GeometryDrawing.Geometry> 
         <MultiBinding Converter="{StaticResource SizeSpacingToCircleGroupConverter}"> 
          <Binding Source="{StaticResource Diameter}" /> 
          <Binding Source="{StaticResource Diameter}" /> 
          <Binding Source="{StaticResource Spacing}" /> 
         </MultiBinding> 
        </GeometryDrawing.Geometry> 
       </GeometryDrawing> 
      </DrawingBrush.Drawing> 
     </DrawingBrush> 
    </Rectangle.Fill> 
</Rectangle> 

난 그냥 내 리소스 사전에 정의 된 복식을 사용하고 있지만 쉽게 뷰 모델에서 바인딩을 사용할 수 있습니다.

다른 이유로 유용 할 수있는 타일 방사형 스윕에 대한 질문 이었기 때문에 나는 여전히 허용 된 대답으로 표시하지 않습니다.