国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

WPF流程圖制作系列相關(guān)基礎(chǔ)二

2019-11-14 15:44:29
字體:
供稿:網(wǎng)友
   我們現(xiàn)在知道 thumb ,可以讓用戶自行拖動其在 canvas上移動,在這個而基礎(chǔ)上 我們可以試著往流程圖方向靠近一下。
我們知道,流程圖,都是一個一個的流程塊,然后用線連起來的,這一個一個的流程塊可能會有各種各樣的形狀, 比如長方形,菱形
這很簡單 ,只需要設(shè)置 thumb使用不同的控件模板就ok.
 
在 界面上 放置了多個 thumb之后, 每一個都是需要響應(yīng)dragDelta事件 才可以實現(xiàn)拖動的, 這樣的話 就基本要給每一個thumb寫上各自的 dragDelta處理方法。 如果這樣子,那代碼就開始臃腫了。
所以 針對可以拖動的滑塊,可以開發(fā)子類 如下:
 
public class MoveThumb :Thumb    {        public MoveThumb()        {            this.DragDelta += MoveThumb_DragDelta;        }        public void MoveThumb_DragDelta(object sender, DragDeltaEventArgs e)        {            Thumb myThumb = (Thumb )sender;            double nTop = Canvas .GetTop(myThumb) + e.VerticalChange;            double nLeft = Canvas .GetLeft(myThumb) + e.HorizontalChange;            Canvas.SetTop(myThumb, nTop);            Canvas.SetLeft(myThumb, nLeft);        }           }

前臺

    <Window.Resources>        <ControlTemplate x :Key="rec">            <Rectangle Fill ="Gray" Width="70" Height="50"></ Rectangle>        </ControlTemplate>        <ControlTemplate x :Key="ell">            <Ellipse Fill ="Gray" Width="70" Height="70"></ Ellipse>        </ControlTemplate>    </Window.Resources >    <Grid >        <Canvas Background ="AliceBlue" HorizontalAlignment="Left" Height="412" Margin="10,10,0,0" VerticalAlignment="Top" Width="522">            <local: MoveThumb Canvas.Left="50" Canvas.Top="50" Template="{StaticResource rec}"></local: MoveThumb>            <local: MoveThumb Canvas.Left="140" Canvas.Top="50" Template="{StaticResource ell}"></local: MoveThumb>            <local: MoveThumb Canvas.Left="250" Canvas.Top="50" Template="{StaticResource ell}"></local: MoveThumb>        </Canvas>    </Grid >

 

效果如下
 是的,我們現(xiàn)在的這些滑塊 都可以在畫布上滑動了。但是 上面代碼的的寫法有不好的地方在于,thumb塊不是內(nèi)容控件,他是不可以在內(nèi)部放東西的。而我們的這一系列功能是為了給以后的流程圖做鋪墊, 而流程圖的塊里面 到時候是需要實際放上我們的activity活動來作為執(zhí)行的。所以我們應(yīng)該 換一種寫法思路來實現(xiàn)目前的這個效果。
我們應(yīng)該改造成 讓界面上的都是內(nèi)容控件,而這些內(nèi)容控件的controlTemplate則使用上面開發(fā)的 MoveThumb。這樣一來 代碼還是要有不少變動的。
頁面元素變?yōu)?/div>
  <ContentControl Canvas.Left ="50" Canvas.Top="50" Template="{StaticResource thumbItemTemplate}">                <Ellipse Width ="50" Height="50" Fill="OrangeRed" IsHitTestVisible="False"></ Ellipse>            </ContentControl>
 <ControlTemplate x :Key="rawThumbTemplate" TargetType="Thumb">            <Rectangle Fill ="Transparent"></Rectangle>        </ControlTemplate>        <ControlTemplate x :Key="thumbItemTemplate" TargetType="ContentControl">            <Grid DataContext ="{Binding RelativeSource ={RelativeSource TemplatedParent}}">                <!--這里的放置順序還是有講究的-->                <local: MoveThumb Template="{ StaticResource rawThumbTemplate}" Cursor="SizeAll"></ local:MoveThumb >                <ContentPResenter Content ="{TemplateBinding Content}"></ContentPresenter>                           </Grid>        </ControlTemplate>
注意到 我們這邊綁定了 模板中 MoveThumb的datacontext為使用這個模板的元素,這樣moveThumb代碼修改如下
 public void MoveThumb_DragDelta( object sender, DragDeltaEventArgs e)        {            Control item = this.DataContext as Control;            if(item!= null)            {                double left = Canvas.GetLeft(item);                double top = Canvas.GetTop(item);                Canvas.SetTop(item,top+e.VerticalChange);                Canvas.SetLeft(item,left+e.HorizontalChange);            }        }
就可以通過 DataContext獲取 實際需要在畫板上位移的元素。 運行出來的效果是一樣的。只不過我們界面上的元素成為了 contentControl,這樣子以后 像其內(nèi)部放東西 就成為可能。
 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 寿宁县| 肃宁县| 章丘市| 上栗县| 驻马店市| 三原县| 通海县| 太康县| 弥勒县| 洱源县| 嘉黎县| 河间市| 永嘉县| 松原市| 手机| 永宁县| 岳池县| 东兰县| 南平市| 丹棱县| 瓦房店市| 扎赉特旗| 阿克陶县| 蕉岭县| 台中县| 南康市| 县级市| 大同县| 郯城县| 宁南县| 青神县| 瑞金市| 麦盖提县| 横山县| 阳春市| 芷江| 巴林左旗| 平顶山市| 玛曲县| 竹北市| 时尚|