Вы можете использовать поведение для его реализации.
public class InkCanvasDeleteBehavior : Behavior<Button>
{
public InkCanvas Canvas
{
get { return (InkCanvas)GetValue(CanvasProperty); }
set { SetValue(CanvasProperty, value); }
}
public static readonly DependencyProperty CanvasProperty =
DependencyProperty.Register("Canvas",
typeof(InkCanvas),
typeof(InkCanvasDeleteBehavior),
new PropertyMetadata(null));
protected override void OnAttached()
{
base.OnAttached();
var btnDelete = this.AssociatedObject as Button;
if(btnDelete!=null)
{
btnDelete.Click += BtnDelete_Click;
}
}
private void BtnDelete_Click(object sender, RoutedEventArgs e)
{
if(this.Canvas!=null)
{
var stokeCollection = this.Canvas.InkPresenter.StrokeContainer.GetStrokes();
foreach (var stroke in stokeCollection)
{
stroke.Selected = true;
}
this.Canvas.InkPresenter.StrokeContainer.DeleteSelected();
}
}
}
Для XAML вы можете использовать поведение таким образом.
<Page
x:Class="Mock.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Mock"
xmlns:behavior="using:Mock.Behaviors"
xmlns:i="using:Microsoft.Xaml.Interactivity"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<InkCanvas x:Name="_canvas" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="1"/>
<Button Content="Delete" HorizontalAlignment="Center" Margin="5">
<i:Interaction.Behaviors>
<behavior:InkCanvasDeleteBehavior Canvas="{Binding ElementName=_canvas}"/>
</i:Interaction.Behaviors>
</Button>
</Grid>
</Page>
PS: Я использую UWP. В WPF некоторый код может быть немного иным, но основная логика такая же.
Существует еще один способ сделать это, передав объект, используя параметр команды, а затем используя команду кнопки, чтобы удалить элемент. Это также сработает. Если вам нужен образец, дайте мне знать.
В дополнение к этому вы также можете использовать поведение, чтобы передать значение модели просмотра. Вы можете сохранить свойство StrokeCollection
в вашей модели просмотра и передать ссылку на поведение. Когда вы рисуете что-то в InkCanvas
, обновите StrokeCollection
в поведении, которое будет отображаться в ViewModel
.
Единственное различие заключалось бы в том, что поведение будет привязано к InkCanvas
вместо кнопки в примере.
Я работаю в WPF и с InkCanvas. Мне нужно добраться до офиса, но с рук не думаю, что у меня есть доступ к InkPresenter или штриху. Выбрано? –
Yup. Вы можете использовать поведение, а также приложенные свойства. Единственная разница между использованием свойств поведения и Attached - причина, по которой вы их используете. Например, Grid.Row - это то, что вы прикрепляете к элементу управления, который становится активным, если элемент управления заключен в сетку, аналогично ScrollViewer.HorizontalScrollbarVisibility и другие. Обычно мы используем поведение, если хотим добавить некоторые функции в некоторый существующий элемент управления. Поэтому мое предложение состояло в том, чтобы идти с поведением. Но приложенное свойство будет делать все хорошо. Cheers :) :) Рад, что у вас есть решение :) :) – undefined