using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Media.Imaging; namespace HistoryDLL { public partial class CyclicScroller : UserControl,IDisposable { private int AutoRunVelocityValue = 0; private bool IsConfigSettingExist = false; private List canUsingLangList = new List(4) { false, false, false, false }; /// /// 初始化除了Spec外的基本設定 /// private void InitialWholeSetting(string settingPath = null) { //建Setting Folder 並判斷是否有存在 ConfigSetting.ini 檔案 if (!Directory.Exists(GlobalFunction.settingPath)) { Directory.CreateDirectory(GlobalFunction.settingPath); } else if (File.Exists(GlobalFunction.ConfigSettingFilePath)) { IsConfigSettingExist = true; } //設定是否啟用切換主標題語系功能 SetChangeLangStatus(); //設定是否啟用回首頁功能 SetHomeBtnStatus(); //取得自動輪播時候的速度 AutoRunVelocityValue = GetAutoRunVelocity(); //掛載 StoryBoard 完成後的事件 storyboardForLocate.Completed += new EventHandler(storyboardForLocate_Completed); //設定自動輪撥的 Timer GlobalFunction.CheckAutoRunTimer.Interval = TimeSpan.FromMilliseconds(ConfigSettingClass.MainBackCollect.BackHomeMillisecond * 1000); GlobalFunction.CheckAutoRunTimer.Tick += CheckAutoRunTimer_Tick; // 取得 4K 解析度設定 GlobalFunction.isSolutionUsing4K = ConfigSettingClass.MainBackCollect.IsUsing4kResolution; //設定背景圖 if (IsConfigSettingExist) { if (File.Exists(GlobalFunction.thumbPath + ConfigSettingClass.MainBackCollect.ImgBackground)) { this.uxBackGroundImg.Visibility = System.Windows.Visibility.Visible; this.Background = Brushes.White; this.uxBackGroundImg.Source = GetBitMap(GlobalFunction.thumbPath + ConfigSettingClass.MainBackCollect.ImgBackground); } else { this.uxBackGroundImg.Visibility = System.Windows.Visibility.Collapsed; this.Background = new SolidColorBrush(ConfigSettingClass.MainBackCollect.BackgroundColor); } } else { //如無設定檔案~則依照解析度載入對應的圖檔 LoadBackgroundFromResolution(); } //設定左上及右上logo if (File.Exists(GlobalFunction.thumbPath + ConfigSettingClass.MainBackCollect.ImgLogo)) { uxLeftLogoMap.Visibility = Visibility.Visible; uxRightLogoMap.Visibility = Visibility.Visible; uxLeftLogoMap.Source = new BitmapImage(new Uri(GlobalFunction.thumbPath + ConfigSettingClass.MainBackCollect.ImgLogo)); uxRightLogoMap.Source = new BitmapImage(new Uri(GlobalFunction.thumbPath + ConfigSettingClass.MainBackCollect.ImgLogo)); RenderOptions.SetBitmapScalingMode(uxLeftLogoMap, BitmapScalingMode.HighQuality); RenderOptions.SetBitmapScalingMode(uxRightLogoMap, BitmapScalingMode.HighQuality); } else { uxLeftLogoMap.Opacity = 0; uxRightLogoMap.Opacity = 0; } } private void LoadBackgroundFromResolution() { if (CurrentMonitorCount.ncm == MonitorFlag.Monitor1_1) { //this.Background = new ImageBrush(new BitmapImage(new Uri(GlobalFunction.thumbPath + "1x1.jpg"))); } else if (CurrentMonitorCount.ncm == MonitorFlag.Monitor2_1) { this.Background = new ImageBrush(new BitmapImage(new Uri(GlobalFunction.thumbPath + "1x2.jpg"))); } else if (CurrentMonitorCount.ncm == MonitorFlag.Monitor3_1) { this.Background = new ImageBrush(new BitmapImage(new Uri(GlobalFunction.thumbPath + "1x3.jpg"))); } } //透過ChangeLan.txt 取得是否顯示改變主標題語系功能 private void SetChangeLangStatus() { if (File.Exists(GlobalFunction.CanChangeLangPath)) { string text = System.IO.File.ReadAllText(GlobalFunction.CanChangeLangPath); int usingCount = 0; if (text.ToLower() == "true") { if (ConfigSettingClass.MainBackCollect.LangText[0] != "") { canUsingLangList[0] = true; usingCount++; } if (ConfigSettingClass.MainBackCollect.LangText[1] != "") { canUsingLangList[1] = true; usingCount++; } if (ConfigSettingClass.MainBackCollect.LangText[2] != "") { canUsingLangList[2] = true; usingCount++; } if (ConfigSettingClass.MainBackCollect.LangText[3] != "") { canUsingLangList[3] = true; usingCount++; } } if (usingCount >= 2) { uxMainLangBtnR.Visibility = Visibility.Visible; uxMainLangBtnL.Visibility = Visibility.Visible; } } } //透過HomeClick.txt 取得是否顯示回首頁功能 private void SetHomeBtnStatus() { if (File.Exists(GlobalFunction.CanHomeClickPath)) { string text = System.IO.File.ReadAllText(GlobalFunction.CanHomeClickPath); if (text.ToLower() == "true") { uxHomeBtnR.Visibility = Visibility.Visible; uxHomeBtnL.Visibility = Visibility.Visible; } } } //透過Velocity.txt 取得設定的自動輪播速度 private int GetAutoRunVelocity() { int result = 5; if (File.Exists(GlobalFunction.AutoRunVelocityPath)) { string text = System.IO.File.ReadAllText(GlobalFunction.AutoRunVelocityPath); result = int.Parse(text); } return result; } //設定自動輪播的動畫 private void SetAutoRunStoryBoard(double from, double to) { autoRunStoryboard.Children.Clear(); DoubleAnimation dbOffset = new DoubleAnimation() { Duration = TimeSpan.FromSeconds(AutoRunVelocityValue), }; ScrollViewerUtilities.UseMotionStop = false; Storyboard.SetTarget(dbOffset, (DependencyObject)this.FindName("uxMyScroll")); Storyboard.SetTargetProperty(dbOffset, new PropertyPath(ScrollViewerUtilities.HorizontalOffsetProperty)); autoRunStoryboard.Children.Add(dbOffset); autoRunStoryboard.FillBehavior = FillBehavior.HoldEnd; dbOffset.From = from; dbOffset.To = to; } private ImageSource GetBitMap(string imgpath) { BitmapImage bitmapImg = new BitmapImage(); bitmapImg.BeginInit(); bitmapImg.UriSource = new Uri(imgpath, UriKind.RelativeOrAbsolute); //忽略原始圖檔的色盤設定,使用預設值,可縮短載入圖檔的時間 //如有遇到色彩不正確的問題,或者原圖有特殊的自定義色盤,請不要使用此設定 bitmapImg.CreateOptions = BitmapCreateOptions.IgnoreColorProfile; //使用以下的預先載入設定,在BitmapImage創建完成之後,可立刻釋放其所占用或鎖住的資源,以免咬住檔案 bitmapImg.CacheOption = BitmapCacheOption.OnLoad; //根據欲顯示的區域長或寬,來設定 DecodePixelHeight 或 DecodePixelWidth 的值 bitmapImg.EndInit(); bitmapImg.Freeze(); return bitmapImg; } /// /// 新建出 Grid For 裝載DetailViewer /// private void CreateExtraUnitGrid() { ExtraUnitGridList.Clear(); for (int count = 0; count < ChildrenCount; count++) { ExtraUnitGrid ExtraGrid = new ExtraUnitGrid(MainEventWidth, MainEventHeight, YearEventHeight, NoneUseRange); ExtraGrid.ExtraUnitGridBubbleToCyclicScrollerEvent += new ExtraUnitGrid.ExtraUnitGridBubbleToCyclicScroller(ExtraGrid_ExtraUnitGridBubbleToCyclicScrollerEvent); ExtraUnitGridList.Add(ExtraGrid); } } /// /// 初始化該 ExtraUnitGrid ~包括 狀態 位置 /// private void InitializeExtraUnitGrid() { int index = 1; //替每個 Grid 標上索引值~該索引值是代表該Grid在螢幕上的位置(從1開始算起) //且如果是第一個或者是最後一個~則狀態UnUse灰色 for (int count = 0; count < ExtraUnitGridList.Count; count++) { ExtraUnitGridList[count].Get_Set_MonitorIndex = index; //設定狀態 if (index == 1 || index == ExtraUnitGridList.Count) { //判斷用 ExtraUnitGridList[count].Get_Set_BlockControlMode = ExtraUnitGrid.ControlMode.UnUse; //回原始狀態用 ExtraUnitGridList[count].SetOriControlMode(ExtraUnitGrid.ControlMode.UnUse); } else { ExtraUnitGridList[count].Get_Set_BlockControlMode = ExtraUnitGrid.ControlMode.CanExtend; ExtraUnitGridList[count].SetOriControlMode(ExtraUnitGrid.ControlMode.CanExtend); } index++; } //調整位置 for (int count = 0; count < ExtraUnitGridList.Count; count++) { //先設定第一個 if (count == 0) { ExtraUnitGridList[count].Margin = new Thickness(-NoneUseRange, 0, 0, uxMyScroll.Margin.Bottom - 5); ExtraUnitGridList[count].RecodeMarginLeft = ExtraUnitGridList[count].Margin.Left; continue; } ExtraUnitGridList[count].Margin = new Thickness(ExtraUnitGridList[count - 1].Margin.Left + MainEventWidth, 0, 0, uxMyScroll.Margin.Bottom - 5); ExtraUnitGridList[count].RecodeMarginLeft = ExtraUnitGridList[count].Margin.Left; } } /// /// 設定當前語系 /// private void SetLanguage() { //預設 System.Windows.Application.Current.Properties["Language"] = "Language1"; uxMainLangBtnL.Content = ConfigSettingClass.MainBackCollect.LangText[0]; uxMainLangBtnR.Content = ConfigSettingClass.MainBackCollect.LangText[0]; //如果更改 if (ConfigSettingClass.MainBackCollect.DefaultLangIndex == 1) { System.Windows.Application.Current.Properties["Language"] = "Language2"; uxMainLangBtnL.Content = ConfigSettingClass.MainBackCollect.LangText[1]; uxMainLangBtnR.Content = ConfigSettingClass.MainBackCollect.LangText[1]; } else if (ConfigSettingClass.MainBackCollect.DefaultLangIndex == 2) { System.Windows.Application.Current.Properties["Language"] = "Language3"; uxMainLangBtnL.Content = ConfigSettingClass.MainBackCollect.LangText[2]; uxMainLangBtnR.Content = ConfigSettingClass.MainBackCollect.LangText[2]; } else if (ConfigSettingClass.MainBackCollect.DefaultLangIndex == 3) { System.Windows.Application.Current.Properties["Language"] = "Language4"; uxMainLangBtnL.Content = ConfigSettingClass.MainBackCollect.LangText[3]; uxMainLangBtnR.Content = ConfigSettingClass.MainBackCollect.LangText[3]; } } /// /// 設定回正被中斷時~應該回到的顯示位置 /// private void SetReturnPos() { System.Windows.Application.Current.Properties["ReturnPos"] = MainEventWidth + NoneUseRange; } /// /// 判斷當前的Index是否超出"最大"容許範圍~進行調整 /// /// private int GetIndexFromRightSide() { int index = currentLoadIndex; if (index < LiveContainerList.Count) { index += 1; } else { index = 1; } return index; } /// /// 判斷當前的Index是否低於"最小"容許範圍~進行調整 /// /// private int GetIndexFromLeftSide() { int index = currentLoadIndex; if (index > 0) { index -= 1; } else { index = LiveContainerList.Count - 1; } return index; } /// /// 透過螢幕可容納的個數取得當前年份中間位置 /// /// private int GetCenterIndexValue() { int result = 0; switch (CurrentMonitorCount.ncm) { case MonitorFlag.Monitor1_1: case MonitorFlag.Monitor2_1: case MonitorFlag.Monitor3_1: case MonitorFlag.Monitor4_1: case MonitorFlag.Monitor5_1: case MonitorFlag.Monitor6_1: { result = ChildrenCount / 2; break; } } return result; } #region 首頁動畫 /// /// 計算總事件~並將該直傳到Homepage中 /// private void CalcCountToHomePage() { if (!RunHomePageAnimation) { return; } int staticvalue = GetCycleCount(); int totalevent = 0; for (int index = 0; index < staticvalue; index++) { for (int count = 0; count < xmlDataList.Count; count++) { totalevent += xmlDataList[count].monthclassList.Count; } } hp.SetEventCount(totalevent); } /// /// Loading start /// private void LoadingStart() { if (RunHomePageAnimation) { this.uxCyclicGrid.Opacity = 0; } } private void AddHomePageAnimation() { if (RunHomePageAnimation) { hp = new HomePage(ResolutionValueWidth, ResolutionValueHeight); hp.SetBlockCommonSetting(MainEventWidth, YearEventHeight, NoneUseRange); hp.SetHistoryWallControl(uxCyclicGrid); hp.OnLoadProgessComplete += Hp_OnLoadProgessComplete; uxMainWindow.Children.Add(hp); } } private void Hp_OnLoadProgessComplete(object sender, EventArgs e) { OnDataLoadCompeleted?.Invoke(this,null); } #endregion #region 自動輪播相關 void CheckAutoRunTimer_Tick(object sender, EventArgs e) { // 確認 Detailviewer 狀況 sdlu if (CheckExtraGridIsVideoRun()) { //將上層Grid關閉 CloseExtraGrid(); //自動輪播開始 WpfDelayDoWork.DoWork(HistoryWallAutoRun, 1000); isAutoRun = true; GlobalFunction.CheckAutoRunTimer.Stop(); } } private bool CheckExtraGridIsVideoRun() { bool isCheckVideo = true; int count = ExtraUnitGridList.Count; for (int i = 0; i < count; i++) { Grid gd = ExtraUnitGridList[i].BorderUp.Child as Grid; if (gd != null && gd.Children.Count > 0) { DetailViewer dv = gd.Children[0] as DetailViewer; if (dv.isPlayVideo) { isCheckVideo = false; break; } } } return isCheckVideo; } /// /// 關閉上層Grid /// private void CloseExtraGrid() { int count = ExtraUnitGridList.Count; for (int i = 0; i < count; i++) { ExtraUnitGridList[i].BorderDown_TouchUp(null, null); } } /// /// 自動移動啟動 /// private void HistoryWallAutoRun() { if (ControlMode == HistoryControlMode.Manual) { ControlMode = HistoryControlMode.AutoRun; SendControlModeToLiveContainer(ControlMode); SetAutoRunStoryBoard(this.uxMyScroll.HorizontalOffset, this.uxMyScroll.HorizontalOffset + MainEventWidth); autoRunStoryboard.Begin(); } } /// /// 關閉自動移動 /// private void StopAutoRunTheWall() { if (ControlMode == HistoryControlMode.AutoRun) { ScrollViewerUtilities.UseMotionStop = true; autoRunStoryboard.Stop(); ControlMode = HistoryControlMode.Manual; SendControlModeToLiveContainer(ControlMode); } } #endregion public void Dispose() { GlobalFunction.CheckAutoRunTimer.Tick -= CheckAutoRunTimer_Tick; } } }