继续聊WPF——数字墨迹B

本文详细介绍了如何创建一个具备书写、擦除功能,并支持自定义笔触颜色的手写板程序,通过使用InkCanvas控件及自定义类实现。
 
前面的内容,我们用简单的方法就创建了一个手写板示例,下面,我们再来做一个更为复杂一点的手写板程序。示例程序有两个选项:选择“书写”可以进行手写输入,选择“擦除”,可以去掉不必要的部分,类似橡皮擦的功能。
并且,还可以选择笔触颜色。
 
 
首先就是放一个InkCanvas控件,相信都没问题,很简单。
 
<Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="auto"/> </Grid.RowDefinitions> <InkCanvas x:Name="myInc" Grid.Row="0" Margin="2" /> ......... </Grid>
接着定义两个类,分别用来保存笔尖颜色的自定义类和集合。
 
public class MyColor { public string ColorName { get; set; } public SolidColorBrush UserColor { get; set; } } public class MyColors : ObservableCollection<MyColor> { public MyColors() { Add(new MyColor { ColorName = "红", UserColor = new SolidColorBrush(Colors.Red) }); Add(new MyColor { ColorName = "黄", UserColor = new SolidColorBrush(Colors.Yellow) }); Add(new MyColor { ColorName = "蓝", UserColor = new SolidColorBrush(Colors.Blue) }); } }
切换到XAML视图,把MyColors作为静态资源嵌入到窗体的资源列表中。
并定义一个数据模板,用于在ListBox中显示的项。
 
<Window.Resources> <m:MyColors x:Key="bindColors" /> <DataTemplate x:Key="itemTmp" DataType="{x:Type m:MyColor}"> <StackPanel Orientation="Horizontal"> <Rectangle Height="10" Width="20" Fill="{Binding UserColor}"/> <TextBlock Text="{Binding ColorName}"/> </StackPanel> </DataTemplate> </Window.Resources>
声明两个RadioButton元素,用于选择手写输入状态。以及一个ListBox控件,数据源就是我们刚才定义的MyColors类。
 
<StackPanel Grid.Row="1" Margin="1" Orientation="Horizontal"> <RadioButton x:Name="rdWrite" IsChecked="True" VerticalAlignment="Center" Content="书写" Checked="rdWrite_Checked" Margin="3,0"/> <RadioButton x:Name="rdEra" VerticalAlignment="Center" IsChecked="{x:Null}" Content="擦除" Checked="rdEra_Checked" Margin="8,0" /> <ListBox x:Name="myListBox" Margin="12,0" ItemTemplate="{StaticResource itemTmp}" ItemsSource="{StaticResource bindColors}" SelectionChanged="myListBox_SelectionChanged"> <ListBox.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </ListBox.ItemsPanel> </ListBox> </StackPanel>
为了能让ListBox中的项水平排列,我们要自定义项的面板。
 
<ItemsPanelTemplate> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate>
为两个单选按钮编写事件处理程序。
 
private void rdWrite_Checked(object sender, RoutedEventArgs e) { this.myInc.EditingMode = InkCanvasEditingMode.InkAndGesture; } private void rdEra_Checked(object sender, RoutedEventArgs e) { this.myInc.EraserShape = new EllipseStylusShape(6, 6); this.myInc.EditingMode = InkCanvasEditingMode.EraseByPoint; }
 
修改InkCanvas的EditingMode属性,可以控制其编辑状态,如接收墨迹,或擦除墨迹。
 
最后,编写ListBox的事件处理程序,以动态修改笔触的颜色。
 
private void myListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems.Count == 0) { return; } MyColor mc = e.AddedItems[0] as MyColor; if (mc != null) { myInc.DefaultDrawingAttributes.Color = mc.UserColor.Color; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值