Главная » WPF » Мозаичные кисти

0

Кисти  ImageBrush, DrawingBrush и  VisualBrush являются мозаичными,   то есть растягивают или повторяют  некоторое изображение (определенное с по мощью растровой  или векторной  графики  либо в виде полного дерева отображе ния), чтобы замостить  им указанную  область. Работа с мозаичной  кистью подра зумевает выполнение трех операций (рис. 5.12): (1) выбор содержимого, которое нужно повторять (с помощью свойств Viewbox и ViewboxUnits), (2) масштабиро вание этого содержимого  (с помощью свойств  Viewport,  ViewportUnits, Stretch, AlignmentX   и  AlignmentY)  и  (3)   заполнение   области   содержимым   свойства Viewport (так, как предписывает  свойство (TileMode).

Кисть ImageBrush принимает  в качестве источника  любое изображение9, а DrawingBrush – любой векторный  рисунок  (мы  еще поговорим  об этом ниже). Но, пожалуй, наибольший интерес представляет кисть VisualBrush.

Рис. 5.13. Заполнение нескольких прямоугольников с помощью кисти VisualBrush

Кисть VisualBrush принимает в качестве источника любой элемент управления

(точнее,  объект  любого  класса,  производного  от System.Windows.Media.Visual).

9

Интересно отметить, что поскольку ImageBrush может принять в качестве источника вектор

ный рисунок, то для заполнения области таким рисунком годится как ImageBrush, так и

DrawingBrush.

Напомним,  что VisualBrush использует  визуальный образ элемента, но не поддер живает интерактивность. Щелчок  мышью по прямоугольнику, заполненному изображениями кнопки, не приведет к нажатию этой кнопки. Вроде бы очевидно, но, запустив такое приложение, как на рис. 5.13, об этом легко забыть!

public class VisualBrushSample : Window {

public VisualBrushSample() { Title = «Visual Brush»;

StackPanel sp = new StackPanel();

Button theButton = new Button(); theButton.HorizontalAlignment = HorizontalAlignment.Left; theButton.VerticalAlignment = VerticalAlignment.Top; theButton.Content = «Click Me!»; sp.Children.Add(theButton);

Rectangle rect = new Rectangle(); rect.Margin = new Thickness(5); rect.Width = 200;

rect.Height = 200; rect.Stroke = Brushes.Black; rect.StrokeThickness = 5; VisualBrush vb = new VisualBrush(); vb.Visual = theButton;

vb.TileMode = TileMode.Tile; vb.Stretch = Stretch.Uniform; vb.Viewport = new Rect(0, 0, 50, 20);

vb.ViewportUnits = BrushMappingMode.Absolute;

rect.Fill = vb;

sp.Children.Add(rect);

Rectangle rect2 = new Rectangle(); rect2.Margin = new Thickness(5); rect2.Width = 500;

rect2.Height = 200; rect2.Stroke = Brushes.Black; rect2.StrokeThickness = 5; VisualBrush vb2 = new VisualBrush(); vb2.Visual = theButton;

rect2.Fill = vb2;

sp.Children.Add(rect2);

Content = sp;

}

}

Отметим,  что один и тот же визуальный элемент  может служить  источником для  нескольких  объектов  VisualBrush. Кроме  того, запустив  эту программу,  мы увидим, что при перемещении мыши по «настоящей» кнопке корректно подсвечи

ваются все ее двойники. VisualBrush – самая развитая из всех кистей просто пото

му, что для выполнения заливки  нам доступны все прочие возможности WPF.

Источник: К. Андерсон  Основы  Windows Presentation Foundation. Пер. с англ. А. Слинкина — М.: ДМК Пресс, 2008 — 432 с.: ил.

По теме:

  • Комментарии