本文主要側重于創作一個應用程序過程中的遇到的問題以及解決問題的思路和方法(當然也包括使用silverlight遇到的問題)。并且說明解決一個問題的多個方法之間的取舍原因。當然這個原因不是絕對的,根據時間的推移和思路的延伸,我們還可以找到更加合適的解決問題的方法。在這個學習silverlight的過程中,希望和大家分享一下學習的心得,關于silverlight的,關于系統設計都有,只要使我覺得比較新鮮有趣的。也希望各位大蝦,新手多多指點。
最新源代碼下載:http://www.shareidea.net/opensource.htm
最新版本在線演示:http://www.shareidea.net/workflow.htm
技術支持QQ群:85444465
本文系列索引:
使用silverlight構建一個工作流設計器(一)
使用silverlight構建一個工作流設計器(二)
使用silverlight構建一個工作流設計器(三)
使用silverlight構建一個工作流設計器(四)
使用silverlight構建一個工作流設計器(五)
使用silverlight構建一個工作流設計器(六)
使用silverlight構建一個工作流設計器(七)
使用silverlight構建一個工作流設計器(八)
使用silverlight構建一個工作流設計器(九)
使用silverlight構建一個工作流設計器(十)
使用silverlight構建一個工作流設計器(十一)
本文主要側重于創作一個應用程序過程中的遇到的問題以及解決問題的思路和方法(當然也包括使用silverlight遇到的問題)。并且說明解決一個問題的多個方法之間的取舍原因。當然這個原因不是絕對的,根據時間的推移和思路的延伸,我們還可以找到更加合適的解決問題的方法。
在這個學習silverlight的過程中,希望和大家分享一下學習的心得,關于silverlight的,關于系統設計都有,只要使我覺得比較新鮮有趣的。也希望各位大蝦,新手多多指點。
五 美化
5.2活動根據不同的活動類型顯示不同的形狀
要是活動根據不同的類型顯示不同的形狀,我們也有幾種方法:
l 根據類型不同,定義不同的圖形顯示
l 根據類型不同,對現有的活動圖形進行剪裁處理。
第一種方法會給我們已有的類造成比較大的修改,因為涉及到圖形在移動時候需要對關聯的規則類進行動態定位的問題。使用第二種方法去沒有這個問題,只需要動體的對活動類進行剪裁處理就可以了。
活動類型有以下幾種:
l 常規交互活動,也就是需要人工參與的活動。
l 自動活動,沒有人工參與的活動,后臺自動完成。
l 分支活動,包括與分支、或分支
l 匯聚活動,包括與匯聚,或匯聚,投票匯聚。
l 起始與終結活動
當我們給活動指定不同的類型時,希望顯示不同的活動形狀。對于常規交互活動,顯示矩形圖形,對于分支和匯聚活動顯示菱形,對于其他活動,顯示圓形。
矩形和圓形分別用EllipseGeometry和RectangleGeometry類進行裁減就可以了,對于菱形,需要使用PathGeometry類進行裁減,這個類的使用有點復雜,需要定義多個轉折點。然后這些點圍成一個菱形。
5.3 給活動和規則增加配置界面
為了給活動設置類型,我們需要給活動增加一個配置界面,具體還是增加一個用戶控件 ,xaml代碼如下:

Code
<UserControl x:Class="Shareidea.Web.UI.Control.Workflow.Setting.ActivitySetting"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
MouseLeftButtonDown="UserControl_MouseLeftButtonDown"
MouseLeftButtonUp="UserControl_MouseLeftButtonUp"
MouseMove="UserControl_MouseMove"
>
<Grid x:Name="LayoutRoot" >
<Border Background="Gold" CornerRadius="30" >
<StackPanel VerticalAlignment="Top" Margin="20" >
<Grid ShowGridLines="False">
<Grid.RowDefinitions>
<RowDefinition Height="30" ></RowDefinition>
<RowDefinition Height="30" ></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60" ></ColumnDefinition>
<ColumnDefinition Width="200"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Text="活動名稱" VerticalAlignment="Center" HorizontalAlignment="Left" Grid.Column="0" Grid.Row="0"></TextBlock>
<TextBlock Text="活動類型" VerticalAlignment="Center" HorizontalAlignment="Left" Grid.Column="0" Grid.Row="1"></TextBlock>
<TextBox Name="txtActivityName" Width="200" VerticalAlignment="Center" HorizontalAlignment="Left" Grid.Column="1" Grid.Row="0"></TextBox>
<ComboBox Name="cbActivityType" Width="200" VerticalAlignment="Center" HorizontalAlignment="Left" Grid.Column="1" Grid.Row="1">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<TextBlock Text="{Binding Path=Name}" Visibility="Collapsed" />
<TextBlock Text="{Binding Path=Text}" VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0 10 0 0" Orientation="Horizontal" >
<Button Name="btnSave" Content="保存" Margin="0 0 0 0" Width="60" Height="30" Click="btnSave_Click" ></Button>
<Button Name="btnClose" Content="關閉" Margin="10 0 0 0" Width="60" Height="30" Click="btnClose_Click" ></Button>
</StackPanel>
</StackPanel>
</Border>
</Grid>
</UserControl>
上面的代碼有兩點需要介紹的:
l ComboBox控件。Silverlight2.0中沒有dropdownlist控件,但是有一個更加強大和靈活的ComboBox控件。ComboBox可以使用內容模板的方式添加子元素(Item),我們可以使用任意一個silverlight控件作為ComboBox的子元素,這樣就給我們很大的靈活性,用來構造復雜的下拉框內容了。
l 控件的綁定語法。在上面的xaml代碼中,使用到了類似于<TextBlock Text="{Binding Path=Name}" 這樣的代碼,這個是silverlight的綁定語法。在后臺代碼中, 使用下面的代碼進行綁定

Code
public ActivitySetting()
{
InitializeComponent();
List<ActivityTypeItem> Cus = new List<ActivityTypeItem>();
Cus.Add(new ActivityTypeItem("AND_BRANCH", "與分支活動"));
Cus.Add(new ActivityTypeItem("AND_MERGE", "與匯聚活動"));
Cus.Add(new ActivityTypeItem("AUTOMATION", "常規自動活動"));
Cus.Add(new ActivityTypeItem("COMPLETION", "終結活動"));
Cus.Add(new ActivityTypeItem("DUMMY", "啞活動"));
Cus.Add(new ActivityTypeItem("INITIAL", "初始化活動"));
Cus.Add(new ActivityTypeItem("INTERACTION", "常規交互活動"));
Cus.Add(new ActivityTypeItem("OR_BRANCH", "或分支"));
Cus.Add(new ActivityTypeItem("OR_MERGE", "或匯聚活動"));
Cus.Add(new ActivityTypeItem("SUBPROCESS", "子流程"));
Cus.Add(new ActivityTypeItem("VOTE_MERGE", "投票匯聚活動"));
cbActivityType.ItemsSource = Cus;
}
public class ActivityTypeItem
{
public string Name { get; set; }
public string Text { get; set; }
public ActivityTypeItem(string name, string text)
{
Name = name;
Text = text;
}
}
對于規則的配置類似于上面的步驟,這里不再贅述 。