
TicksToTimeSpanConverter.cs
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Data;
using System.Globalization;
namespace SGSGHome.Views.TaskTrace
{
public class TicksToTimeSpanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return TimeSpan.FromTicks((long)(double)value);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
<UserControl x:Class="SGSGHome.Views.TaskTrace.TaskGantt"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
xmlns:local="clr-namespace:SGSGHome.Views.TaskTrace"
d:DesignWidth="1200" d:DesignHeight="600">
<UserControl.Resources>
<local:TicksToTimeSpanConverter x:Key="TicksToTimeSpanConverter" />
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Margin="3" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center">
<TextBlock VerticalAlignment="Center">时间范围:从</TextBlock>
<sdk:DatePicker Name="FromDate"></sdk:DatePicker>
<TextBlock VerticalAlignment="Center">至</TextBlock>
<sdk:DatePicker Name="ToDate"></sdk:DatePicker>
<TextBlock VerticalAlignment="Center" Margin="3">项目名称:</TextBlock>
<ComboBox Name="cbProject" Width="150" Height="20"></ComboBox>
<Button Name="btnOK" Content="确定" Width="50" Height="22" Click="btnOK_Click" Margin="3,0,0,0"></Button>
<!-- ZOOM slider-->
<TextBlock VerticalAlignment="Center" Margin="3,0,0,0">放大</TextBlock>
<Border BorderBrush="Gray" BorderThickness="1" Margin="2">
<telerik:RadSlider VerticalAlignment="Center" Width="120" x:Name="PixelLength"
Minimum="10000000" Maximum="60000000000" Value="35000000000"/>
</Border>
<TextBlock VerticalAlignment="Center">缩小</TextBlock>
</StackPanel>
<telerik:RadGanttView x:Name="ganttView"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
MouseLeftButtonDown="ganttView_MouseLeftButtonDown"
Grid.Row="1"
PixelLength="{Binding Value, ElementName=PixelLength, Converter={StaticResource TicksToTimeSpanConverter}}">
<telerik:RadGanttView.Columns>
<telerik:TreeColumnDefinition Header="任务名称" />
<telerik:ColumnDefinition MemberBinding="{Binding AssignTo}" Header="负责人" ColumnWidth="200" />
<telerik:ColumnDefinition MemberBinding="{Binding ProgressString}" Header="任务进度" ColumnWidth="80" />
<telerik:ColumnDefinition MemberBinding="{Binding HasDoc}" Header="文档"/>
<telerik:ColumnDefinition MemberBinding="{Binding Start,StringFormat=yyyy-MM-dd}" Header="开始时间" ColumnWidth="100" />
<telerik:ColumnDefinition MemberBinding="{Binding End,StringFormat=yyyy-MM-dd}" Header="预计完成时间" ColumnWidth="100" />
<telerik:ColumnDefinition MemberBinding="{Binding ActualFinishDate,StringFormat=yyyy-MM-dd}" Header="实际完成时间" ColumnWidth="100" />
</telerik:RadGanttView.Columns>
</telerik:RadGanttView>
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Telerik.Windows.Controls.GanttView;
using Telerik.Windows.Controls.Scheduling;
using System.Collections.ObjectModel;
namespace SGSGHome.Views.TaskTrace
{
public class GanttTaskEx : GanttTask
{
public string AssignTo { get; set; }
public string ProgressString { get; set; }
public string PreTaskName { get; set; }
public DateTime? ActualFinishDate { get; set; }
public string HasDoc { get; set; }
public GanttTaskEx() { }
public GanttTaskEx(DateTime start, DateTime end, string title) : base(start, end, title) { }
}
public partial class TaskGantt : UserControl
{
public bool IsManager { get; set; }
public ObservableCollection<TaskTraceService.TaskTrace> TaskTraceList { get; set; }
public ObservableCollection<TaskTraceService.v_TaskDocCount> TaskDocCountList { get; set; }
public GanttTaskEx Root { get; set; }
TaskTraceService.TaskServiceClient client;
CoreService.CoreServiceClient xClient;
public TaskGantt()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(TaskGantt_Loaded);
}
void TaskGantt_Loaded(object sender, RoutedEventArgs e)
{
FromDate.SelectedDate = DateTime.Now.AddDays(-15);
ToDate.SelectedDate = DateTime.Now.AddDays(15);
this.TaskTraceList = new ObservableCollection<TaskTraceService.TaskTrace>();
xClient = new CoreService.CoreServiceClient();
xClient.HasRightCompleted += new EventHandler<CoreService.HasRightCompletedEventArgs>(xClient_HasRightCompleted);
client = new TaskTraceService.TaskServiceClient();
client.GetTaskByProjectNoCompleted += new EventHandler<TaskTraceService.GetTaskByProjectNoCompletedEventArgs>(client_GetTaskByProjectNoCompleted);
client.GetTaskByMemberCompleted += new EventHandler<TaskTraceService.GetTaskByMemberCompletedEventArgs>(client_GetTaskByMemberCompleted);
client.GetProjectNoListCompleted += new EventHandler<TaskTraceService.GetProjectNoListCompletedEventArgs>(client_GetProjectNoListCompleted);
client.GetProjectNoListAsync();
client.GetTaskDocCountCompleted += new EventHandler<TaskTraceService.GetTaskDocCountCompletedEventArgs>(client_GetTaskDocCountCompleted);
client.GetTaskDocCountAsync();
}
void client_GetTaskDocCountCompleted(object sender, TaskTraceService.GetTaskDocCountCompletedEventArgs e)
{
TaskDocCountList = e.Result;
}
void client_GetTaskByProjectNoCompleted(object sender, TaskTraceService.GetTaskByProjectNoCompletedEventArgs e)
{
TaskTraceList = e.Result;
if (e.Result.Count > 0)
{
FromDate.SelectedDate = e.Result.Min(x => x.StartDate).AddDays(-1);
ToDate.SelectedDate = e.Result.Max(x => x.FinishDate).AddDays(1);
this.Root = new GanttTaskEx(e.Result.Min(x => x.StartDate), e.Result.Max(x => x.FinishDate), ((TaskTraceService.ProjectBuild)cbProject.SelectedItem).ProjectName);
AddChild(TaskTraceList, null, Root);
}
else
{
Root = null;
}
}
void xClient_HasRightCompleted(object sender, CoreService.HasRightCompletedEventArgs e)
{
IsManager = AppContext.IsSupervisor || e.Result;
cbProject_SelectionChanged(null, null);
}
void client_GetProjectNoListCompleted(object sender, TaskTraceService.GetProjectNoListCompletedEventArgs e)
{
if (e.Result.Count > 0)
{
cbProject.ItemsSource = e.Result;
cbProject.DisplayMemberPath = "ProjectName";
cbProject.SelectedValuePath = "ProjectNo";
cbProject.SelectedIndex = 0;
cbProject.SelectionChanged += new SelectionChangedEventHandler(cbProject_SelectionChanged);
xClient.HasRightAsync(AppContext.LogonUserID, "SGSGHome.Views.TaskTrace.TaskManage", Operation.GetTagName(Operation.Tag.All));
}
}
void cbProject_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (IsManager)
{
client.GetTaskByProjectNoAsync(cbProject.SelectedValue.ToString());
}
else
{
client.GetTaskByMemberAsync(AppContext.LogonUserName, cbProject.SelectedValue.ToString());
}
}
void client_GetTaskByMemberCompleted(object sender, TaskTraceService.GetTaskByMemberCompletedEventArgs e)
{
TaskTraceList = e.Result;
if (e.Result.Count > 0)
{
FromDate.SelectedDate = e.Result.Min(x => x.StartDate).AddDays(-1);
ToDate.SelectedDate = e.Result.Max(x => x.FinishDate).AddDays(1);
this.Root = new GanttTaskEx(e.Result.Min(x => x.StartDate), e.Result.Max(x => x.FinishDate), ((TaskTraceService.ProjectBuild)cbProject.SelectedItem).ProjectName);
AddChild(TaskTraceList, null, Root);
}
else
{
Root = null;
}
}
private void ganttView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 2)
{
var r = ganttView.SelectedItem as GanttTaskEx;
if (r != null && r.UniqueId != null)
{
var w = new OutputDoc();
w.TaskTrace = TaskTraceList.Single(x => x.TaskID == long.Parse(r.UniqueId));
w.CurrentUser = AppContext.LogonUserName;
w.Show();
}
}
}
private void btnOK_Click(object sender, RoutedEventArgs e)
{
if (FromDate.SelectedDate != null && ToDate.SelectedDate != null)
{
if (FromDate.SelectedDate.Value < ToDate.SelectedDate.Value)
{
if (Root != null)
{
ganttView.VisibleRange = new VisibleRange(FromDate.SelectedDate.Value, ToDate.SelectedDate.Value);
ganttView.TasksSource = new ObservableCollection<GanttTaskEx>() { Root };
}
else
{
MessageBox.Show("没有数据!", "提示", MessageBoxButton.OK);
}
}
}
}
void AddChild(IList<TaskTraceService.TaskTrace> dataList, long? preTaskID, GanttTaskEx preTask)
{
var filterList = dataList.Where(x => x.PreTaskID == preTaskID).ToList();
foreach (var tt in filterList)
{
var childTask = new GanttTaskEx()
{
Start = tt.StartDate,
End = tt.FinishDate,
Title = tt.TaskName,
ActualFinishDate = tt.ActualFinishDate,
AssignTo = tt.AssignTo,
Progress = (double)tt.CompletePercent,
ProgressString = ((double)tt.CompletePercent).ToString() + "%",
UniqueId = tt.TaskID.ToString(),
PreTaskName = tt.PreTaskName,
HasDoc = TaskDocCountList.Any(x => x.TaskID == tt.TaskID) ? "√" : ""
};
preTask.Children.Add(childTask);
var childrenList = TaskTraceList.Where(x => x.PreTaskID == tt.TaskID).ToList();
if (childrenList.Count > 0)
{
AddChild(childrenList, tt.TaskID, childTask);
}
}
}
}
}