2013-08-17 2 views
0

Я рисую прямоугольник в текстовом поле, используя контекст чертежа, используя следующий код.тень на геометрии, нарисованная drawcontext в wpf

  drawingContext.DrawRoundedRectangle(
       new SolidColorBrush(Color.FromRgb(255, 246, 178)), null, 
       new Rect(new Point(rect.TopRight.X + 20, rect.TopRight.Y), 
         new Size(130, rect.Height)), 
         3, 
         3); 

Я хочу визуализировать тень на этом прямоугольнике, который я рисую программно в WPF. Как мне это сделать ?

ответ

1

Добавить эффект визуальной

Попробуйте что-то вроде этого

public class MyControl: Control 
{ 
    private Rect rect = new Rect(100, 100, 200, 200); 

    protected override void OnRender(DrawingContext drawingContext) 
    { 
     var r = new Rect(new Point(rect.TopRight.X + 20, rect.TopRight.Y), 
         new Size(130, rect.Height)); 
     var brush = new SolidColorBrush(Color.FromRgb(255, 246, 178)); 

     DropShadowEffect effect = new DropShadowEffect(); 
     effect = new DropShadowEffect {Color = Colors.Gainsboro, Direction = 30}; 
     this.Effect = effect; 

     drawingContext.DrawRoundedRectangle(brush, null, r, 3, 3); 
     base.OnRender(drawingContext); 
    } 

}

Это дает мне:

enter image description here

EDIT

Если у вас нет элемента интерфейса для присоединения эффекта, вам нужно сделать тень самостоятельно. Просто добавьте еще один прямоугольник под своим основным, с некоторой градиентной кистью, которая станет прозрачной.

protected override void OnRender(DrawingContext drawingContext) 
    { 
     var r = new Rect(new Point(rect.TopRight.X + 20, rect.TopRight.Y), 
         new Size(130, rect.Height)); 
     var r2 = new Rect(new Point(rect.TopRight.X + 25, rect.TopRight.Y+5), 
         new Size(130, rect.Height)); 

     var brush = new SolidColorBrush(Color.FromRgb(255, 246, 178)); 

     var gradientBrush = new LinearGradientBrush(Colors.Black, Colors.Gray, 30); 

     drawingContext.DrawRoundedRectangle(gradientBrush, null, r2, 3, 3); 
     drawingContext.DrawRoundedRectangle(brush, null, r, 3, 3); 

     base.OnRender(drawingContext); 
    } 

Это даст вам что-то вроде этого

enter image description here

+0

Спасибо за ответ Себастьян. Я думаю, что мой вопрос неполный. Ваш ответ работает, потому что рендеринг происходит на UIElement, у которого есть поле Effect. Для моего случая я представляю этот прямоугольник в текстовом поле. (в основном фоновый рендерер на AvalonEdit). Таким образом, для него нет поля эффектов. Как я могу отобразить этот элемент управления? Какие-либо предложения ? – ssarangi

+0

Я отредактировал ответ, возможно, это предложение поможет –

+0

Perfect !! Это работает Себастьян – ssarangi