WPF学习12:基于MVVM Light 制作图形编辑工具(3)
??? 本文是WPF學(xué)習(xí)11:基于MVVM Light 制作圖形編輯工具(2)的后續(xù)
??? 這一次的目標(biāo)是完成
??? 兩個(gè)任務(wù)。
??? 本節(jié)完成后的效果:
???
??? 本文分為三個(gè)部分:
??? 1.對(duì)之前代碼不合理的地方重新設(shè)計(jì)。
??? 2.圖形可選擇外框顏色,填充顏色的實(shí)現(xiàn)簡(jiǎn)介。
??? 3.拖動(dòng)圖形的實(shí)現(xiàn)簡(jiǎn)介。
?
修改之前的代碼
??? 我們?cè)趯懘a的時(shí)候,經(jīng)常回頭看之前的代碼,如果覺(jué)得之前的代碼有問(wèn)題,這時(shí)候條件如果允許,就改了吧。
??? 做出的改動(dòng):
??? 1.修改Image為Canvas。????
??? 目的:使圖形的縮放和移動(dòng)這部分的代碼實(shí)現(xiàn)大大簡(jiǎn)化。
??? 去除了配置按鈕。原因是:因?yàn)镮mage被換成了Canvas,更改畫布大小的成本降低至接近0,直接把Canvas的寬高實(shí)現(xiàn)綁定就可以了。、
??? 代碼就不貼了,附件中有工程源碼。
???
?
顏色部分
??? 效果:
??? 過(guò)程:首先是綁定顏色相關(guān)的List與屬性。在前臺(tái)代碼中我們需要寫好模板與綁定:
<TextBlock VerticalAlignment="Center"><Run Text="外框顏色:"/></TextBlock> <ComboBox Width="100" Margin="0 0 10 0" ItemsSource="{Binding AvailableColors}" SelectedItem="{Binding BorderColor}"><ComboBox.ItemTemplate><DataTemplate><Rectangle Width="87" Height="15" Fill="{Binding}"/></DataTemplate></ComboBox.ItemTemplate> </ComboBox> <TextBlock VerticalAlignment="Center"><Run Text="填充顏色:"/></TextBlock> <ComboBox Width="100" Margin="0 0 10 0" ItemsSource="{Binding AvailableColors}" SelectedItem="{Binding BackGroundColor}"><ComboBox.ItemTemplate><DataTemplate><Rectangle Width="87" Height="15" Fill="{Binding}"/></DataTemplate></ComboBox.ItemTemplate> </ComboBox>??? 接下來(lái),我們?cè)赩iewModel中要實(shí)現(xiàn)一個(gè)列表與兩個(gè)顏色的屬性,注意:ItemSource綁定的元素需要為Public的屬性,不能是字段!
private Brush _borderColor; public Brush BorderColor {get { return _borderColor; }set { _borderColor = value;RaisePropertyChanged("BorderColor");} }private Brush _backGroundColor; public Brush BackGroundColor {get { return _backGroundColor; }set {_backGroundColor = value;RaisePropertyChanged("BackGroundColor");} }public List<Brush> AvailableColors { get; set; }/// <summary> /// Init property in ctor /// </summary> public MainViewModel() {AvailableColors = new List<Brush>() { new SolidColorBrush(Colors.Red),new SolidColorBrush(Colors.Black),new SolidColorBrush(Colors.Green),new SolidColorBrush(Color.FromRgb(1,180,255)),};//Init default drawing size & ColorDrawingAreaWidth = DrawingAreaHeight = 200;BackGroundColor = BorderColor = AvailableColors[0]; }??? 如圖,到了這一步,數(shù)據(jù)綁定就完成啦。
??? 通過(guò)BackGroundColor,BorderColor我們又可以拿到選定的顏色,在后臺(tái)代碼中,畫圖時(shí),把它們用上就好了。代碼位于附件。
?
?
拖動(dòng)部分
??? 新建類ShapeManagement 由它來(lái)管理縮放與移動(dòng)。
class ShapeManagement {private Shape previseSelectedShape;private Brush previseSelectedShapeBrush;//使被選中的圖形呈現(xiàn)橘黃色private Brush selectedBrush = Brushes.Orange;public void SelectedChange(Shape shape){ClearSelectedEffect();previseSelectedShape = shape;previseSelectedShapeBrush = previseSelectedShape.Fill.Clone();previseSelectedShape.Fill = selectedBrush;}public void ClearSelectedEffect(){if (previseSelectedShape != null)previseSelectedShape.Fill = previseSelectedShapeBrush;} }??? 在ViewModel創(chuàng)建一個(gè)圖形管理器:
private ShapeManagement shapeManagement = new ShapeManagement();??? 在MouseDown中加入如下代碼:
if(MovingModeEnable) {if (e.Source is Shape)shapeManagement.SelectedChange(e.Source as Shape);else if(e.Source is Panel)shapeManagement.ClearSelectedEffect(); }??? 如圖,我們現(xiàn)在可以拿到被點(diǎn)擊的對(duì)象
??? 之后就是移動(dòng)的部分,在ShapeManagement加入如下代碼:
class ShapeItem {public Shape DisplayShape { get; set; }public TranslateTransform translateTransform { get; set; }public Point PositonRecord { get; set; }public Point HistoryPositonRecord { get; set; } }private List<ShapeItem> shapeList = new List<ShapeItem>();public void Add(Shape shape) {var shapeItem = new ShapeItem(){DisplayShape = shape,translateTransform = new TranslateTransform(),PositonRecord = new Point(),HistoryPositonRecord = new Point()};shapeList.Add(shapeItem);shape.RenderTransform = new TransformGroup(){Children = new TransformCollection() { shapeItem.translateTransform }}; }??? 之前,我們已經(jīng)拿到了當(dāng)前選中的對(duì)象,然后就可以根據(jù)LINQ查詢,來(lái)操作該對(duì)象,找到相應(yīng)的變形,點(diǎn)的信息,予以操作。
??? 代碼在附件中,目前還有一些BUG。
??? 開發(fā)環(huán)境VS2013, .NET4.5。
??? 源碼
?轉(zhuǎn)載于:https://www.cnblogs.com/E-WALKER/p/4468160.html
總結(jié)
以上是生活随笔為你收集整理的WPF学习12:基于MVVM Light 制作图形编辑工具(3)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 善于总结所做所学的内容
- 下一篇: CSS 盒子模型(Box model)中