DrawingView
Предоставляет DrawingView
поверхность, которая позволяет рисованию линий с помощью сенсорного или мыши взаимодействия. Результат рисования пользователей можно сохранить в виде изображения.
Распространенный вариант использования заключается в предоставлении поля подписи в приложении.
Базовое использование
DrawingView
позволяет задать цвет линии, ширину линии и привязать к коллекции строк.
XAML
Включение пространства имен XAML
Чтобы использовать набор средств в XAML, xmlns
необходимо добавить на страницу или представление следующее:
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
Поэтому следующее:
<ContentPage
x:Class="CommunityToolkit.Maui.Sample.Pages.MyPage"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
</ContentPage>
Будет изменено, чтобы включить следующее xmlns
:
<ContentPage
x:Class="CommunityToolkit.Maui.Sample.Pages.MyPage"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit">
</ContentPage>
Использование DrawingView
<toolkit:DrawingView
Lines="{Binding MyLines}"
LineColor="Red"
LineWidth="5" />
C#
using CommunityToolkit.Maui.Views;
var drawingView = new DrawingView
{
Lines = new ObservableCollection<IDrawingLine>(),
LineColor = Colors.Red,
LineWidth = 5
};
На следующем снимка экрана показан полученный Объект DrawingView в Android:
Использование нескольких линий
По умолчанию DrawingView
поддерживается только 1 строка. Для включения MultiLine
значения IsMultiLineModeEnabled
true. Убедитесь, что ShouldClearOnFinish
значение false.
XAML
<views:DrawingView
Lines="{Binding MyLines}"
IsMultiLineModeEnabled="true"
ShouldClearOnFinish="false" />
C#
using CommunityToolkit.Maui.Views;
var gestureImage = new Image();
var drawingView = new DrawingView
{
Lines = new ObservableCollection<IDrawingLine>(),
IsMultiLineModeEnabled = true,
ShouldClearOnFinish = false,
};
На следующем снимка экрана показан полученный Объект DrawingView в Android:
Обработка события при завершении строки рисования
DrawingView
позволяет подписаться на такие события, как OnDrawingLineCompleted
. Соответствующая команда DrawingLineCompletedCommand
также доступна.
XAML
<views:DrawingView
Lines="{Binding MyLines}"
DrawingLineCompletedCommand="{Binding DrawingLineCompletedCommand}"
OnDrawingLineCompleted="OnDrawingLineCompletedEvent" />
C#
using CommunityToolkit.Maui.Views;
var gestureImage = new Image();
var drawingView = new DrawingView
{
Lines = new ObservableCollection<IDrawingLine>(),
DrawingLineCompletedCommand = new Command<IDrawingLine>(async (line) =>
{
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
var stream = await line.GetImageStream(gestureImage.Width, gestureImage.Height, Colors.Gray.AsPaint(), cts.Token);
gestureImage.Source = ImageSource.FromStream(() => stream);
})
};
drawingView.OnDrawingLineCompleted += async (s, e) =>
{
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
var stream = await e.LastDrawingLine.GetImageStream(gestureImage.Width, gestureImage.Height, Colors.Gray.AsPaint(), cts.Token);
gestureImage.Source = ImageSource.FromStream(() => stream);
};
Использование в ScrollView
При использовании DrawingView
внутри сенсорного ScrollView
взаимодействия с ScrollView
ним иногда можно перехватывать в iOS. Это можно предотвратить, установив ShouldDelayContentTouches
для свойства значение false
в iOS, как показано в следующем примере:
Эта проблема решена путем добавления ios:ScrollView.ShouldDelayContentTouches="false" в ScrollView, содержащего DrawingView:
<ContentPage
xmlns:ios="clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;assembly=Microsoft.Maui.Controls">
<ScrollView ios:ScrollView.ShouldDelayContentTouches="false">
<DrawingView />
</ScrollView>
</ContentPage>
Дополнительные сведения см. в касаниях содержимого ScrollView.
Расширенное использование
Чтобы получить полные преимущества, DrawingView
предоставляет методы для получения потока изображения линий рисования.
XAML
<toolkit:DrawingView
x:Name="DrawingViewControl"
Lines="{Binding MyLines}"
IsMultiLineModeEnabled="true"
ShouldClearOnFinish="true"
DrawingLineCompletedCommand="{Binding DrawingLineCompletedCommand}"
OnDrawingLineCompleted="OnDrawingLineCompletedEvent"
LineColor="Red"
LineWidth="5"
HorizontalOptions="Fill"
VerticalOptions="Fill">
<toolkit:DrawingView.Background>
<LinearGradientBrush StartPoint="0,0"
EndPoint="0,1">
<GradientStop Color="Blue"
Offset="0"/>
<GradientStop Color="Yellow"
Offset="1"/>
</LinearGradientBrush>
</toolkit:DrawingView.Background>
</toolkit:DrawingView>
C#
using CommunityToolkit.Maui.Views;
var gestureImage = new Image();
var drawingView = new DrawingView
{
Lines = new ObservableCollection<IDrawingLine>(),
IsMultiLineModeEnabled = true,
ShouldClearOnFinish = false,
DrawingLineCompletedCommand = new Command<IDrawingLine>(async (line) =>
{
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
var stream = await line.GetImageStream(gestureImage.Width, gestureImage.Height, Colors.Gray.AsPaint(), cts.Token);
gestureImage.Source = ImageSource.FromStream(() => stream);
}),
LineColor = Colors.Red,
LineWidth = 5,
Background = Brush.Red
};
drawingView.OnDrawingLineCompleted += async (s, e) =>
{
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
var stream = await e.LastDrawingLine.GetImageStream(gestureImage.Width, gestureImage.Height, Colors.Gray.AsPaint(), cts.Token);
gestureImage.Source = ImageSource.FromStream(() => stream);
};
// get stream from lines collection
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
var lines = new List<IDrawingLine>();
var stream1 = await DrawingView.GetImageStream(
lines,
new Size(gestureImage.Width, gestureImage.Height),
Colors.Black.
cts.Token);
// get steam from the current DrawingView
var stream2 = await drawingView.GetImageStream(gestureImage.Width, gestureImage.Height, cts.Token);
Свойства
Свойство | Type | Описание |
---|---|---|
Позиции | ObservableCollection<IDrawingLine> |
IDrawingLine Коллекция данных, которые в настоящее время находятся вDrawingView |
IsMultiLineModeEnabled | bool |
Переключение многострочный режим. Если значение true, можно нарисовать DrawingView несколько строк во время нажатия или щелчка между строками. Примечание. Если ClearOnFinish также включена, линии очищаются после освобождения нажатия или щелчка. Кроме того, DrawingLineCompletedCommand будет запущено после каждой линии, нарисованной. |
ShouldClearOnFinish | bool |
Указывает, очищается ли объект DrawingView после освобождения касания или щелчка и рисуется линия. Примечание. Если IsMultiLineModeEnabled также включена, это может привести к неожиданному поведению. |
DrawingLineStartedCommand | ICommand |
Эта команда вызывается всякий раз, когда начинается рисование строки DrawingView . |
DrawingLineCancelledCommand | ICommand |
Эта команда вызывается всякий раз, когда рисунок строки в DrawingView отмене. |
DrawingLineCompletedCommand | ICommand |
Эта команда вызывается при каждом завершении рисования строки DrawingView . . Обратите внимание, что это происходит после нажатия или нажатия кнопки. Если MultiLineMode эта команда включена несколько раз. |
PointDrawnCommand | ICommand |
Эта команда вызывается всякий раз при завершении рисования точки DrawingView . |
OnDrawingLineStarted | EventHandler<DrawingLineStartedEventArgs> |
DrawingView событие возникает при запуске строки рисования. |
OnDrawingLineCancelled | EventHandler<EventArgs> |
DrawingView событие возникает при отмене строки рисования. |
OnDrawingLineCompleted | EventHandler<DrawingLineCompletedEventArgs> |
DrawingView событие возникает при завершении строки рисования. |
OnPointDrawn | EventHandler<PointDrawnEventArgs> |
DrawingView событие возникает при рисовании точек. |
LineColor | Color |
Цвет, используемый по умолчанию для рисования линии.DrawingView |
LineWidth | float |
Ширина, используемая по умолчанию для рисования линии.DrawingView |
Рисование линии
Содержит DrawingLine
список точек и позволяет настраивать стиль каждой строки по отдельности.
Свойства
Свойство | Type | Описание | Default value |
---|---|---|---|
LineColor | Color |
Цвет, используемый для рисования линии на .DrawingView |
Colors.Black |
LineWidth | float |
Ширина, используемая для рисования линии на.DrawingView |
5 |
Точки | ObservableCollection<PointF> |
Коллекция PointF из этого делает линию. |
new() |
Степень детализации | int |
Степень детализации этой линии. Минимальное значение равно 5. Чем выше значение, тем более гладкой линией, чем медленнее программа. | 5 |
ShouldSmoothPathWhenDrawn | bool |
Включает или отключает, если эта строка сглаживается (с псевдонимом) при рисовании. | false |
Пользовательский интерфейс IDrawingLine
Существует 2 шага для замены по умолчанию пользовательской реализацией DrawingLine
:
- Создание пользовательского класса, реализующего
IDrawingLine
:public class MyDrawingLine : IDrawingLine { public ObservableCollection<PointF> Points { get; } = new(); ... }
- Создание настраиваемого класса, реализующего
IDrawingLineAdapter
.public class MyDrawingLineAdapter : IDrawingLineAdapter { public IDrawingLine(MauiDrawingLine mauiDrawingLine) { return new MyDrawingLine { Points = mauiDrawingLine.Points, ... } } }
- Настройка настраиваемого
IDrawingLineAdapter
вIDrawingViewHandler
:var myDrawingLineAdapter = new MyDrawingLineAdapter(); drawingViewHandler.SetDrawingLineAdapter(myDrawingLineAdapter);
DrawingLineStartedEventArgs
Аргумент события, содержащий последнюю точку рисования.
Свойства
Свойство | Type | Описание |
---|---|---|
Point | PointF |
Последняя точка рисования. |
DrawingLineCompletedEventArgs
Аргумент события, содержащий последнюю строку рисования.
Свойства
Свойство | Type | Описание |
---|---|---|
LastDrawingLine | IDrawingLine |
Последняя линия рисования. |
PointDrawnEventArgs
Аргумент события, содержащий последнюю точку рисования.
Свойства
Свойство | Type | Описание |
---|---|---|
Point | PointF |
Последняя точка рисования. |
Методы
Метод | Description |
---|---|
GetImageStream | Извлекает Stream изображение, содержащее изображение Lines , которое в настоящее время рисуется на объекте DrawingView . |
GetImageStream (static) | Извлекает Stream изображение коллекции IDrawingLine , предоставленной в качестве параметра. |
Примеры
Пример этой функции можно найти в действии в сообществе .NET MAUI набор средств пример приложения.
API
Исходный код DrawingView
можно найти в репозитории сообщества .NET MAUI набор средств GitHub.
.NET MAUI Community Toolkit