using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace HistoryDLL { /// /// LiveContainer.xaml 的互動邏輯 /// public partial class LiveContainer : UserControl { //uxUpSide 被點擊紀錄為第幾個事件 private int TriggerEvent = 0; private int TriggerPicture = 0; public enum ShowMethod { ShowForTwo = 0x01, ShowForSix = 0x10, }; //創造 LiveContainer 物件 private delegate void CreateLiveContainerDelegate(); //事件個數 public XmlData xmlData = new XmlData(); private int eventCount = 2; private ShowMethod showMethod = ShowMethod.ShowForTwo; //PlaneRotate 暫存區 private List PlaneRotateMapList = new List(); private Grid MainUpSideGrid = new Grid(); //當前 LiveConainer 在 CyclisScroller中的索引位置 private int ContainerIndex = -1; //Gird 經過切割後每個小區塊的寬高設定 //兩塊 private int BitmapBWidth = 290; private int BitmapBHeight = 225; //六塊 private int BitmapSWidth = 210; private int BitmapSHeight = 158; // 區塊切割倍數 private int cutMultiple = 1; //亂數產生 private Random rnd = new Random(Guid.NewGuid().GetHashCode()); //顯示該區塊是否可點擊的顏色設定 private SolidColorBrush CanControlColor = new SolidColorBrush(ConfigSettingClass.TimelineCollect.BackgroundColor); private SolidColorBrush CantControlColor = new SolidColorBrush(ConfigSettingClass.TimelineExtentCollect.BackgroundColor); private SolidColorBrush TextBlockControlColor = new SolidColorBrush(ConfigSettingClass.TimelineCollect.TextColor); //原始物件寬度 private int OriginalObjectWidth = 0; private bool canControl = true; public int Set_Get_ContainerIndex { set { ContainerIndex = value; } get { return ContainerIndex; } } public LiveContainer(XmlData Data, int objectWidth, int objectHeight) { InitializeComponent(); if (GlobalFunction.isSolutionUsing4K) { BitmapBWidth *= 2; BitmapBHeight *= 2; BitmapSWidth *= 2; BitmapSHeight *= 2; uxDownSide.Height *= 2; cutMultiple *= 2; uxYearStr.FontSize *= 1.5; } xmlData = Data; uxUpSide.Width = uxLiveContainerMainGrid.Width = OriginalObjectWidth = objectWidth; uxUpSide.Height = uxLiveContainerMainGrid.Height = objectHeight; //該年份有幾個事件~? eventCount = xmlData.monthclassList.Count; //上方 Border 處理 //判斷該年份事件各數是兩個以下(包括兩個)或者以上 if (eventCount > 2) { showMethod = ShowMethod.ShowForSix; //切割成六塊 CutTheGridToSixBlock(); //縮小每個區塊可容納圖片大小 BitmapBWidth = BitmapSWidth; BitmapBHeight = BitmapSHeight; } else { showMethod = ShowMethod.ShowForTwo; //切割成兩塊 CutTheGridToTwoBlock(); } uxUpSide.Child = MainUpSideGrid; //下方 Border 處理 WriteYearBarStr(); uxYearStr.Foreground = TextBlockControlColor; uxDownSide.PreviewTouchDown += new EventHandler(uxDownSide_PreviewTouchDown); } internal void WriteYearBarStr() { string langStr = xmlData.yearlan1; if (ConfigSettingClass.MainBackCollect.DefaultLangIndex == 1) { langStr = xmlData.yearlan2; } else if (ConfigSettingClass.MainBackCollect.DefaultLangIndex == 2) { langStr = xmlData.yearlan3; } else if (ConfigSettingClass.MainBackCollect.DefaultLangIndex == 3) { langStr = xmlData.yearlan4; } if (ConfigSettingClass.MainBackCollect.DefaultLangIndex < ConfigSettingClass.MainBackCollect.LangFlowDir.Length) { uxYearStr.FlowDirection = ConfigSettingClass.MainBackCollect.LangFlowDir[ConfigSettingClass.MainBackCollect.DefaultLangIndex]; } uxYearStr.Text = langStr; } internal void ChangeCurPlaneRotateLan() { for (int i = 0; i < MainUpSideGrid.Children.Count; i++) { PlaneRotateMap prm = MainUpSideGrid.Children[i] as PlaneRotateMap; prm.ChangeLanByDynamic(); } } internal void ChangePlaneRotateLan() { for (int i = 0; i < PlaneRotateMapList.Count; i++) { PlaneRotateMap prm = PlaneRotateMapList[i] as PlaneRotateMap; prm.ChangeLanByDynamic(); } } internal void CreateLiveContainer() { //將這個年份的所有事件創出來並建立出 PlaneRotate System.Windows.Application.Current.Dispatcher.Invoke(new CreateLiveContainerDelegate(CreateLiveContainerBkWork)); } private void CreateLiveContainerBkWork() { CreateEventRotate(); //開始將創建出來的PlaneRotate放入 ShowThePlaneRotate(); } //被通知當前區塊應該要處理的動作 public void ListenFromCyclicTouchStatus(CyclicScroller cs) { cs.CyclicScrollerBubbleToLiveContainerEvent += new CyclicScroller.CyclicScrollerBubbleToLiveContainer(ReceiveFromCyclicScroller); } #region 當上或者下區塊被點擊~這兩個其中一個Key會被啟動並通知CyclicScroller //下方年份 void uxDownSide_PreviewTouchDown(object sender, TouchEventArgs e) { TriggerEvent = 0; TriggerPicture = 0; SendInfoToCyclicScroller("TouchDown"); } //上方 PlaneRotate 有物件被點擊 void RecevieFromPlaneRotateMapForCheckTouch(int indexofevent, int indexofpicture) { TriggerEvent = indexofevent; TriggerPicture = indexofpicture; SendInfoToCyclicScroller("TouchDown"); } #endregion /// /// 將創建出來的PlaneRotate放入 /// (放入的方式由做下層開始由左至右) /// private void ShowThePlaneRotate() { //兩個事件處理 if (showMethod == ShowMethod.ShowForTwo) { int j = 3; int rndIndex = 0; MainUpSideGrid.Children.Clear(); for (int i = 0; i < eventCount; i++, j -= 2) { PlaneRotateMap newprm = new PlaneRotateMap(); //亂數取得要放入的 PlaneRotateMap (不重複) rndIndex = rnd.Next(0, PlaneRotateMapList.Count); //抽出該PlaneRotateMap 並做設定~完後指到 newprm newprm = SelectprmToShow(rndIndex, i); //加到Gird中 MainUpSideGrid.Children.Add(newprm); //放入指定的位置 Grid.SetRow(newprm, j); //移除該prm在亂數選擇的Buffer當中 (該 Buffer 只存在沒有顯示的事件) PlaneRotateMapList.RemoveAt(rndIndex); } } else if (showMethod == ShowMethod.ShowForSix) { int j = 5, k = 1; int rndIndex = 0; MainUpSideGrid.Children.Clear(); for (int i = 0; i < eventCount; i++) { PlaneRotateMap newprm = new PlaneRotateMap(); //亂數取得要放入的 PlaneRotateMap (不重複) rndIndex = rnd.Next(0, PlaneRotateMapList.Count); //抽出該PlaneRotateMap 並做設定~完後指到 newprm newprm = SelectprmToShow(rndIndex, i); //加到Gird中 MainUpSideGrid.Children.Add(newprm); //放入指定的位置 Grid.SetRow(PlaneRotateMapList[rndIndex], j); Grid.SetColumn(PlaneRotateMapList[rndIndex], k); //移除該prm在亂數選擇的Buffer當中 (該 Buffer 只存在沒有顯示的事件) PlaneRotateMapList.RemoveAt(rndIndex); //如果是基數次則 if (k == 3) { j -= 2; k = 1; } else { k += 2; } if (j <= 0) break; } } } /// /// 抽出該PlaneRotateMap 並做設定~完後指到 newprm /// /// 選擇的PlaneRotateMap的索引值 /// 在該區塊中顯示的位置 /// private PlaneRotateMap SelectprmToShow(int rndIndex, int blockIndex) { //顯示 PlaneRotateMapList[rndIndex].startShow(); //將該區塊位置索引指給 PlaneRotateMap的BlockIndex PlaneRotateMapList[rndIndex].BlockIndex = blockIndex; return PlaneRotateMapList[rndIndex]; } /// ///依照事件數量創造出相應的PlaneRotate /// private void CreateEventRotate() { for (int eventcount = 0; eventcount < eventCount; eventcount++) { PlaneRotateMap prm = new PlaneRotateMap(xmlData.monthclassList[eventcount], BitmapBWidth, BitmapBHeight); prm.indexOfEvent = eventcount; //通知 LiveContainer 通道 prm.ListenFromLiveContainerCode(this); //接收來自 PlaneRotateMap 通知的通道(確認是否為點擊?) prm.PlaneRotateMapBubbleToLiveContainerEvent += new PlaneRotateMap.PlaneRotateMapBubbleToLiveContainer(RecevieFromPlaneRotateMapForCheckTouch); //接收來自 PlaneRotateMap 通知的通道(確認可顯示的資料是否已經到底) prm.PlaneRotateFileIsBlankEvent += new PlaneRotateMap.PlaneRotateFileIsBlank(ReceiveFromPlaneRotateFileBlankInfo); prm.CreatePlaneRotateMap(); //之後在換事件的時候可以透過SetRow or SetCol去選擇Grid要顯示哪一個或者哪一個需要改變 PlaneRotateMapList.Add(prm); } } //控制該年份的時間軸顏色 public void ChangeControlColor(bool CanControl) { if (CanControl) { uxDownSide.Background = CanControlColor; } else { uxDownSide.Background = CantControlColor; } canControl = CanControl; } //將 MainUpSideGrid 切成兩塊 private void CutTheGridToTwoBlock() { //切成上下兩塊 RowDefinition NoneUseUp = new RowDefinition(); RowDefinition rdBk1 = new RowDefinition(); RowDefinition rdMid = new RowDefinition(); RowDefinition rdBk2 = new RowDefinition(); NoneUseUp.Height = new GridLength(48 * cutMultiple); rdBk1.Height = new GridLength(225 * cutMultiple); rdMid.Height = new GridLength(10 * cutMultiple); rdBk2.Height = new GridLength(225 * cutMultiple); MainUpSideGrid.RowDefinitions.Add(NoneUseUp); MainUpSideGrid.RowDefinitions.Add(rdBk1); MainUpSideGrid.RowDefinitions.Add(rdMid); MainUpSideGrid.RowDefinitions.Add(rdBk2); } //將 MainUpSideGrid 切成六塊 private void CutTheGridToSixBlock() { //切成上中下三塊 RowDefinition rdUp = new RowDefinition(); RowDefinition rdBk1 = new RowDefinition(); RowDefinition rdRow1 = new RowDefinition(); RowDefinition rdBk2 = new RowDefinition(); RowDefinition rdRow2 = new RowDefinition(); RowDefinition rdBk3 = new RowDefinition(); rdUp.Height = new GridLength(15 * cutMultiple); rdBk1.Height = new GridLength(158 * cutMultiple); rdRow1.Height = new GridLength(10 * cutMultiple); rdBk2.Height = new GridLength(158 * cutMultiple); rdRow2.Height = new GridLength(10 * cutMultiple); rdBk3.Height = new GridLength(158 * cutMultiple); MainUpSideGrid.RowDefinitions.Add(rdUp); MainUpSideGrid.RowDefinitions.Add(rdBk1); MainUpSideGrid.RowDefinitions.Add(rdRow1); MainUpSideGrid.RowDefinitions.Add(rdBk2); MainUpSideGrid.RowDefinitions.Add(rdRow2); MainUpSideGrid.RowDefinitions.Add(rdBk3); //切成左右兩個區塊 ColumnDefinition colLeft = new ColumnDefinition(); ColumnDefinition colLeftLeft = new ColumnDefinition(); ColumnDefinition colRight = new ColumnDefinition(); ColumnDefinition colRightRight = new ColumnDefinition(); ColumnDefinition colMid = new ColumnDefinition(); colLeftLeft.Width = new GridLength(10 * cutMultiple); colLeft.Width = new GridLength(210 * cutMultiple); colMid.Width = new GridLength(10 * cutMultiple); colRight.Width = new GridLength(210 * cutMultiple); colRightRight.Width = new GridLength(10 * cutMultiple); MainUpSideGrid.ColumnDefinitions.Add(colLeftLeft); MainUpSideGrid.ColumnDefinitions.Add(colLeft); MainUpSideGrid.ColumnDefinitions.Add(colMid); MainUpSideGrid.ColumnDefinitions.Add(colRight); MainUpSideGrid.ColumnDefinitions.Add(colRightRight); } } }