У меня есть холст (не InkCanvas!), И я могу рисовать на нем полилинии. Это работает нормально, но есть огромная проблема с выводом за границы, как показано в GIF ниже.
Мой холст находится внутри ScrollViewer, а ScrollViewer - внутри GridView.
Я попытался поймать указатель, покидающий холст, с помощью следующих обработчиков событий:
canvas.PointerExited += Canvas_PointerExited;
canvas.PointerCaptureLost += Canvas_PointerCaptureLost;
Но похоже, что эти события запускаются слишком медленно.
Я попытался использовать свойство Clip своего холста, но поведение не изменилось. И для холста UWP нет свойства ClipToBound.
Все мое представление создается в Code-Behind, потому что мне нужно создать несколько холстов в одном представлении.
Есть ли способ остановить такое поведение?
РЕДАКТИРОВАТЬ1:
По запросу: больше понимания моего кода.
Страница XAML выглядит так:
<Grid x:Name="BoundingGrid">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="15*"/>
</Grid.RowDefinitions>
<Grid x:Name="InkGrid" VerticalAlignment="Top" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" />
<Grid x:Name="CanvasGrid" Grid.Row="1" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" VerticalAlignment="Top"/>
</Grid>
Все это внутри страницы.
Мой код выглядит так:
Мои конструкторы:
public ImprovedCanvasManager(Grid boundingGrid, Grid overviewGrid, string filepath, double height)
{
drawCanvas = new Canvas();
overviewGrid.Loaded += OverviewGrid_Loaded;
overviewGrid.SizeChanged += OverviewGrid_SizeChanged;
RowDefinition rd = new RowDefinition();
rd.Height = new GridLength(height);
overviewGrid.RowDefinitions.Add(rd);
InitializeScrollViewer();
Grid.SetRow(scroll, overviewGrid.RowDefinitions.Count);
Grid.SetColumn(scroll, 0);
scroll.Content = drawCanvas;
overviewGrid.Children.Add(scroll);
LoadImage(filepath);
}
public ImprovedCanvasManager(Grid boundingGrid, Grid overviewGrid, Grid inkToolGrid, string filepath, double height = 1000) : this(boundingGrid, overviewGrid, filepath, height)
{
AddDrawingToolsToCanvas(inkToolGrid, overviewGrid);
EnableDrawingOnCanvas(drawCanvas);
}
У меня есть только два конструктора, чтобы упростить мне создание холстов с возможностью рисования и без способности рисовать.
Вот как я инициализирую свой ScrollViewer:
private void InitializeScrollViewer()
{
scroll = new ScrollViewer();
scroll.VerticalAlignment = VerticalAlignment.Top;
scroll.VerticalScrollMode = ScrollMode.Auto;
scroll.HorizontalScrollMode = ScrollMode.Auto;
scroll.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
scroll.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible;
scroll.ZoomMode = ZoomMode.Enabled;
scroll.ManipulationMode = ManipulationModes.All;
scroll.MinZoomFactor = 1;
scroll.MaxZoomFactor = 3;
}
Это единственные строки кода, которые влияют на построение любого представления.
Изменить 2:
Мой холст не заполняет окружающую сетку слева, а внизу.