/// <summary> /// Shows ControlPanel on the rightest ControlMarket /// after we delete the "old" rightest ControlStock /// /// </summary> /// <param name="stockNumDelete"></param> public void ShowControlPanelOnRightStock(int stockNumDelete) { //only if we delete rightes ControlMarket if (stockNumDelete == KernelTerminal.StockVisualConf.ListStocksVisual.Count - 1) { //-2 cause 1)numeration from zero and 2)stock was not removed from StockVisualConf int num = KernelTerminal.StockVisualConf.ListStocksVisual.Count - 2; num = Math.Max(num, 0); //if (stockNumDelete == 0) //num = KernelTerminal.StockVisualConf.ListStocksVisual.Count - 1; foreach (var child in GridMarket.Children) { if (child is ControlMarket) { ControlMarket cm = (ControlMarket)child; if (cm.StockNum == num) { cm.ShowWindowControlPannels(); } } } } }
/* * public void ClickMenuItemWindow<TChildWindow>() where TChildWindow : Window * { * KernelTerminal.ViewModelDispatcher.OpenChildWindow <TChildWindow>(); * } */ /// <summary> /// On add stock do hide all WindowControlPanels, except the rightest stock (with largest StockNum) /// Call method after change stock configuration (add or replace) /// /// Call from: /// 1) Mainwindow.AddAllStocksFromConfig /// 2) Mainwindow.AddStockFromButton /// 3) MainWindow.ReplaceControlMarket /// </summary> public void HideWindowControlPanels() { int cntOfStocks = KernelTerminal.MaxStockNum; foreach (var child in GridMarket.Children) { if (child is ControlMarket) { ControlMarket cm = (ControlMarket)child; if (cm.StockNum != cntOfStocks) { cm.HideWindowControlPannels(); } else { /* MarketViewModel mvm = CKernelTerminal.GetViewModelDispatcherInstance().GetMarketViewModel(cm.StockNum) * if (mvm!=null) * { * mvm. * * }*/ } } } }
public void CheckStocksForDelEnable() { int count = 0; ControlMarket cm = null; foreach (var child in GridMarket.Children) { if (child is ControlMarket) { count++; cm = (ControlMarket)child; } } if (count <= 1) //still single stock { return; } foreach (var child in GridMarket.Children) { if (child is ControlMarket) { cm = (ControlMarket)child; cm.EnableDeleteStock(); } } }
private void SubscribeMainWinEvents(ref ControlMarket controlMarket) { MainWindow mw = (MainWindow)CUtilWin.FindWindow <MainWindow>(); controlMarket.ButtonClose.PreviewMouseUp += mw.ControlStock_ButtonClose_PreviewMouseUp; controlMarket.ButtonMaximizeNormalize.PreviewMouseUp += mw.ControlStock_ButtonMaximizeNomalize_PreviewMouseUp; controlMarket.ButtonMinimize.PreviewMouseUp += mw.ControlStock_ButtonMinimize_PreviewMouseUp; controlMarket.ButtonMaximizeNormalize.PreviewMouseUp += controlMarket.ButtonMaximizeNmormilize_PreviewMouseUp; }
/// <summary> /// 1)Calls SetParameters (deprecated) /// 2)Call SubscribeMainWinEvents (subscribe ControlMarket to MainWindow events) /// 3)Call BindToViewModel (data binding operations) /// 4)Inserts to ControlMarkets list /// 5)Updates Z indexes /// /// Call from: /// 1) CKernelTerminal.AddOneStockFromConfig /// 2) CkernelTerminal.AddEmptyStock /// 3) ReplaceControlMarket /// </summary> public void AddControlMarket(ControlMarket controlMarket, MarketViewModel marketViewModel) { SetParameters(ref controlMarket, marketViewModel); SubscribeMainWinEvents(ref controlMarket); BindToViewModel(ref controlMarket, marketViewModel); //Note: add to list in position specified by StockNum _lstControlMarket.Insert(controlMarket.StockNum, controlMarket); // _lstControlMarket.Add(controlMarket); UpdateZIndexes(); }
/// <summary> /// Creates new MarketViewModel instance and adds it to dictioanary with viewmodels /// /// Call from /// 1) CKernelTerminal.AddOneStockFromConfig /// 2) CKernelTerminal.AddEmptyStock /// </summary> public void AddMarketViewModelNew(int stockNum, ControlMarket controlMarket, CStocksVisual stockVisual, CInstrumentConfig instrumentConfig) { //TODO access using unique id of market try { lock (_dictKIsinVMarketViewModel) _dictKIsinVMarketViewModel.Add(stockVisual.Ticker, new MarketViewModel(stockNum, controlMarket, _kernelTerminal, stockVisual, instrumentConfig)); } catch (Exception e) { Error("AddMarketViewModelNew", e); } }
private void CancellInstrOrder(ControlMarket controlMarket) { MarketViewModel mv = (MarketViewModel)controlMarket.DataContext; CDataCloseInstPos dataClose = new CDataCloseInstPos { Instrument = controlMarket.ControlStockInstance.TickerName, ConId = mv.ConnId }; ExecuteCommand(EventsGUI.CancellInstrumentOrders, dataClose); return; }
private void BindWorkAmount(ControlMarket controlMarket, MarketViewModel marketViewModel) { //TODO make with observable collection ControlWorkAmount ControlWrkAmountGrid = controlMarket.ControlDealsInstance.WorkAmountGrid; List <ControlAmountTextBlock> lstAmTextBlock = new List <ControlAmountTextBlock>() { ControlWrkAmountGrid.AmountTextBlock1, ControlWrkAmountGrid.AmountTextBlock2, ControlWrkAmountGrid.AmountTextBlock3, ControlWrkAmountGrid.AmountTextBlock4, ControlWrkAmountGrid.AmountTextBlock5, }; // controlMarket.ControlDealsInstance.WorkAmountGrid.DataContext = marketViewModel; //controlMarket.ControlStockInstance.DataContext = marketViewModel; CUtil.SetBinding(marketViewModel, "CurrAmountNum", controlMarket.ControlDealsInstance.WorkAmountGrid, ControlWorkAmount.CurrAmountNumProperty, true); // CUtil.SetBinding(marketViewModel, "CurrAmountNum", controlMarket.ControlStockInstance, ControlStock.CurrAmountNumProperty, true); controlMarket.ControlDealsInstance.WorkAmountGrid.SelectActualControlAmount(); CUtil.SetBinding(marketViewModel, "ListWorkAmount", controlMarket.ControlStockInstance, ControlStock.ListWorkAmountProperty); for (int i = 0; i < NumAmounts; i++) { marketViewModel.ListWorkAmount.Add(new CWorkAmount()); lstAmTextBlock[i].DataContext = marketViewModel.ListWorkAmount[i]; CUtil.SetBinding(marketViewModel.ListWorkAmount[i], "TextAmountValue", lstAmTextBlock[i], ControlAmountTextBlock.TextAmountValueProperty); CUtil.SetBinding(marketViewModel, "StockNum", lstAmTextBlock[i], ControlAmountTextBlock.StockNumProperty); marketViewModel.ListWorkAmount[i].TextAmountValue = marketViewModel.InstrumentConfig.WorkAmounts[i].ToString(); //RaisePropertyChanged("ListWorkAmount"); } }
/// <summary> /// If Empty instrument disable ButtonAddStock /// </summary> public void CheckAddButtonVisibility() { foreach (var child in GridMarket.Children) { if (child is ControlMarket) { ControlMarket cm = (ControlMarket)child; if (cm.ControlStockInstance.TickerName == Literals.Undefind) { cm.ButtonAddStock.Visibility = Visibility.Collapsed; } else { cm.ButtonAddStock.Visibility = Visibility.Visible; } } } }
/// <summary> /// Call when Connected stock need replace with the new one /// 1) Find VieModel with oldTicker, reset IsAlive (stops network processing /// data thread) /// 2) Remove old ticker MarketViewModel from dictKIsinVMarketViewModel /// 3) Creates new ticker MarketViewModel and add it to _dictKIsinVMarketViewModel /// /// Call from CKernelTerminal.EditConnectedStock /// </summary> public void ReplaceMarketViewModel(int stockNum, string oldTicker, CStocksVisual stockVisual, ControlMarket controlMarket, CInstrumentConfig instrumentConfig) { lock (_dictKIsinVMarketViewModel) { var res = _dictKIsinVMarketViewModel.Values.FirstOrDefault(a => a.ControlMarket.StockNum == stockNum); //Where(key => key.StockNum == stockNum); if (res != null) { res.IsAlive = false; _dictKIsinVMarketViewModel.Remove(oldTicker); _dictKIsinVMarketViewModel[stockVisual.Ticker] = new MarketViewModel(stockNum, controlMarket, _kernelTerminal, stockVisual, instrumentConfig); //upd 2017_08_27 // _dictKIsinVMarketViewModel[stockVisual.Ticker].IsConnectedToServer = true; } } }
/// <summary> /// 1) Delete GridSplitter from visual tree and /// GridSplitter's column from grid /// 2) Delete ControlMarket from visual tree and /// ControlMarket's column from grid /// Note. Each ControlMarket has StockNum property /// with enumeration from 0 to N. And the same is /// for GridSplitter but using tag. /// Enumeration in ColumnDefiniions and in /// Child list is even (0,2,4) for ControlMarket, /// odd (1,3,5) for GridSplitter /// /// Call from: /// KernerlTerminal.DeleteExistingStock /// </summary> public void DeleteStock(int stockNum) { //Delete GridSplitter foreach (var child in GridMarket.Children) { if (child is GridSplitter) { GridSplitter gs = (GridSplitter)child; if ((int)gs.Tag == stockNum) { int col = Grid.GetColumn(gs); GridMarket.ColumnDefinitions.RemoveAt(col); GridMarket.Children.Remove(gs); break; } } } //Delete ControlMarket foreach (var child in GridMarket.Children) { if (child is ControlMarket) { ControlMarket cm = (ControlMarket)child; if (cm.StockNum == stockNum) { int col = Grid.GetColumn(cm); GridMarket.Children.Remove(cm); GridMarket.ColumnDefinitions.RemoveAt(col); break; } } } CheckStocksForButtDelDisable(); ShowControlPanelOnRightStock(stockNum); SetWidthOfStocks(); }
/// <summary> /// Find ControlMarket with given number, remove it /// from viusal tree creates new one then add it to /// visual tree. /// /// </summary> /// <param name="stockNum"></param> /// <returns></returns> public ControlMarket ReplaceControlMarket(int stockNum) { ControlMarket mc = new ControlMarket(stockNum, this); Grid.SetRow(mc, 0); Grid.SetColumn(mc, 2 * stockNum); //NOTE +1 because 0 is ControlAlarm GridMarket.Children.RemoveAt(2 * stockNum); GridMarket.Children.Insert(2 * stockNum, mc); HideWindowControlPanels(); SetWidthOfStocks(); // CKernelTerminal.GetViewDispatcherInstance().UpdateZIndexes(); // Canvas.SetZIndex(mc, 10 - stockNum); return(mc); }
/// <summary> /// Disable button delete stock if stock is /// single /// </summary> public void CheckStocksForButtDelDisable() { int count = 0; ControlMarket cm = null; foreach (var child in GridMarket.Children) { if (child is ControlMarket) { count++; cm = (ControlMarket)child; } } if (count == 1) { if (cm != null) { cm.DisableDeleteStock(); } } }
/// <summary> /// Set the width of stock depend if stock the rightest /// (with control menu) or not. /// For the rightest stock set width auto (width calculated, /// by content's width) and minimum width (to make all control /// elements visible on resizing), for the other stocks /// use * and sensible minimum width (to protect agains "silly" /// small width). /// Note, in grid using even number for ControlMarket and odd /// for the GridSplitter. /// /// Call from: /// 1) AddAllStocksFromConfig /// 2) AddStockFromButton /// 3) ReplaceControlMarket /// 4) DeleteStock /// </summary> public void SetWidthOfStocks() { int iStockVis = 0; int colCount = GridMarket.ColumnDefinitions.Count; //Set width of grid's columns //note, 0 - ControlMarket, 1 - splitter, etc, that's why increase by two for (int i = 0; i < GridMarket.ColumnDefinitions.Count; i += 2) { iStockVis++; var col = GridMarket.ColumnDefinitions[i]; //for the rightest column if ((i == colCount - 2) && (colCount > 2)) //2017-03-22 upd if single stock nothing to do { // col.Width = GridLength.Auto; col.Width = new GridLength(1, GridUnitType.Star);//2018-05-03 change was auto //col.Width = new GridLength(1, GridUnitType.Star); // col.Width = new GridLength(widthOfControlMarket);//tempo 2018-05-02 //col.MinWidth = Math.Max(170, this.Width / (colCount / 2)); col.MinWidth = 100; //2018-05-03 change was calculated above //col.MaxWidth = 1200; } else //for the other column { col.Width = new GridLength(1, GridUnitType.Star); //col.Width = new GridLength(widthOfControlMarket);//tempo 2018-05-02 col.MinWidth = 100; } } iStockVis = 0; int cntOfStocks = KernelTerminal.MaxStockNum; //Set width of ControlStocks foreach (var child in GridMarket.Children) { if (child is ControlMarket) { ControlMarket cm = (ControlMarket)child; double widthOfStock = KernelTerminal.StockVisualConf.ListStocksVisual[iStockVis].WidthStock; double widthOfClusters = KernelTerminal.StockVisualConf.ListStocksVisual[iStockVis].WidthClusters; //the rightest ControlMarket (with window contol buttons) if ((cm.StockNum == cntOfStocks) && (colCount > 2)) //2017-03-22 upd if single stock- nothing to do { //2017-11-16 changed for Alexeev's request // - previously was 110 //cm.ColControlStock.MinWidth = 110; cm.ColControlStock.MinWidth = 110; //2018-05-03 back //TODO - make specific setting //cm.ColControlStock.Width = new GridLength(1.0000001, GridUnitType.Star); //cm.ColControlStock.Width = GridLength.Auto; cm.ColControlStock.Width = new GridLength(widthOfStock);//2018-05-02 cm.ColControlClusters.Width = new GridLength(widthOfClusters); //cm.ColControlDeals.MinWidth = 30; //cm.ColControlDeals.Width = GridLength.Auto; } //the other ControlMarkets else { cm.ColControlStock.MinWidth = 30; //cm.ColControlStock.Width = new GridLength(1, GridUnitType.Star); cm.ColControlStock.Width = new GridLength(widthOfStock); //2018-05-02 cm.ColControlClusters.Width = new GridLength(widthOfClusters); // cm.ColControlStock.Width = new GridLength(226); } iStockVis++; } } foreach (var child in GridMarket.Children) { if (child is ControlMarket) { ControlMarket cm = (ControlMarket)child; cm.ControlStockInstance.IsInitializeComplete = true; cm.ControlClustersInstance.IsInitializeComplete = true; } } }
/// <summary> /// /// </summary> /// <param name="controlMarket"></param> /// <param name="marketViewModel"></param> // TODO: separate parameters and bindings to other methods. Or/and remove settings public void BindToViewModel(ref ControlMarket controlMarket, MarketViewModel marketViewModel) { //========================================================================= MARKET VIEWMODEL BINDINGS ================================================================ //bind ControlStockInstance controlMarket.ControlStockInstance.DataContext = marketViewModel; controlMarket.ControlStockInstance.BindToSystem(/*(ITradeOperations)marketViewModel*,*/ _kernelTerminal, marketViewModel.TickerName, _kernelTerminal.TerminalConfig.MaxRepaintTimeMS); marketViewModel.ForceRepaintControlStock = controlMarket.ControlStockInstance.ForceRepaint; CStockProperties sp = marketViewModel.InstrumentConfig.MarketProperties.StockProperties; CDataBinder.BindFromList(marketViewModel, controlMarket.ControlStockInstance, sp); CDealsProperties dp = new CDealsProperties(); CDataBinder.BindFromList(marketViewModel, controlMarket.ControlDealsInstance, dp); CClusterProperties cp = marketViewModel.InstrumentConfig.MarketProperties.ClusterProperties; CDataBinder.BindFromList(marketViewModel, controlMarket.ControlClustersInstance, cp); //=========================================================================END MARKET VIEWMODEL BINDINGS ================================================================ controlMarket.ControlUserPosInstance.DataContext = marketViewModel.VMUserPos; // CUtil.SetBinding(marketViewModel, "ActualWidth", (FrameworkElement)controlMarket.ControlStockInstance, FrameworkElement.ActualWidthProperty); //specific binding CUserPosProperties upp = new CUserPosProperties(); //CDataBinder.BindFromList(marketViewModel.VMUserPos, controlMarket.ControlStockInstance.DOUSerPos, upp); CDataBinder.BindAllFromViewModel(marketViewModel.VMUserPos, controlMarket.ControlStockInstance.DOUSerPos); controlMarket.DataContext = marketViewModel; //========================================================================= BIND CONTROL MARKETS PROPERTIES ===================================================================== //trick: on binding value of controlMarket.StockNum(correct) overrides with value //of MarketViewModel (incorrect) so remember old value and set it after binding int stockNum = controlMarket.StockNum; CUtil.SetBinding(marketViewModel, "StockNum", controlMarket, ControlMarket.StockNumProperty, twoWayBinding: true); marketViewModel.StockNum = stockNum; CUtil.SetBinding(marketViewModel, "SelectionMode", controlMarket, ControlMarket.SelectionModeProperty, twoWayBinding: true); CUtil.SetBinding(marketViewModel, "IsModeKeyboardTrading", controlMarket, ControlMarket.IsModeKeyboardTradingProperty); //=========================================================================END BIND CONTROL MARKETS PROPERTIES ===================================================================== //======================================================================== BIND CLUSTER PROCESSOR =================================================================================== CUtil.SetBinding(marketViewModel.ClusterProcessor, "ClusterPriceAmount", controlMarket.ControlClustersInstance, ControlClusters.ClusterPriceAmountProperty); CUtil.SetBinding(marketViewModel.ClusterProcessor, "DisablePaintClusters", controlMarket.ControlClustersInstance, ControlClusters.DisablePaintClustersProperty); CUtil.SetBinding(marketViewModel.ClusterProcessor, "DisableRecalcClusters", controlMarket.ControlClustersInstance, ControlClusters.DisableRecalcClustersProperty); CUtil.SetBinding(marketViewModel.ClusterProcessor, "LstTimes", controlMarket.ControlClustersInstance, ControlClusters.LstTimesProperty); CUtil.SetBinding(marketViewModel.ClusterProcessor, "ClusterDate", controlMarket.ControlClustersInstance, ControlClusters.ClusterDateProperty); //=========================================================================END BIND CLUSTER PROCESSOR ========================================================================================================== // ========================================================================== TERMINAL VIEWMODEL BINDINGS =========================================================== CTerminalCommonProperties tcp = _kernelTerminal.TerminalConfig.TerminalProperties.TerminalCommonProperties; CDataBinder.BindFromList(_kernelTerminal.ViewModelDispatcher.TerminalViewModel, controlMarket, tcp); //TODO move line up TerminalViewModel termViewModel = _kernelTerminal.ViewModelDispatcher.TerminalViewModel; CDataBinder.BindFromList(termViewModel, controlMarket.ControlStockInstance, tcp); CDataBinder.BindFromList(termViewModel, controlMarket.ControlDealsInstance, tcp); CDataBinder.BindFromList(termViewModel, controlMarket.ControlClustersInstance, tcp); CTerminalStockProperties tsp = _kernelTerminal.TerminalConfig.TerminalProperties.TerminalStockProperties; CDataBinder.BindFromList(termViewModel, controlMarket.ControlStockInstance, tsp); CTerminalDealsProperties tdp = _kernelTerminal.TerminalConfig.TerminalProperties.TerminalDealsProperties; CDataBinder.BindFromList(termViewModel, controlMarket.ControlDealsInstance, tdp); CTerminalClustersProperties tclstp = _kernelTerminal.TerminalConfig.TerminalProperties.TerminalClustersProperties; CDataBinder.BindFromList(termViewModel, controlMarket.ControlClustersInstance, tclstp); //controlMarket.StockClock.DataContext = termViewModel; CUtil.SetBinding(termViewModel, "StockClock", controlMarket.StockClock, TextBlock.TextProperty); //controlMarket.StockClock. // ============ =============================================================END TERMINAL VIEWMODEL BINDINGS =========================================================== controlMarket.ControlClustersInstance.UpdateSettings(); controlMarket.ControlClustersInstance.InitFontSizeScaled(); // controlMarket.ControlDealsInstance.BindToSystem(_kernelTerminal /*, (ITradeOperations)marketViewModel*/); BindWorkAmount(controlMarket, marketViewModel); // EvntDispMarketViewModel e = new EvntDispMarketViewModel(marketViewModel); }
private void SetParameters(ref ControlMarket controlMarket, MarketViewModel marketViewModel) { controlMarket.DataContext = marketViewModel; }
/// <summary> /// Deletes existing ControlMarcket and adds new ControlMarkets. /// Use for "connected" Instrument /// /// Calling from CKernelTerminal.EditConnectedStock /// </summary> public void ReplaceControlMarket(int stockNum, ref ControlMarket controlMarket, MarketViewModel marketViewModel) { DeleteControlMarket(stockNum); AddControlMarket(controlMarket, marketViewModel); }
public MarketViewModel(int stockNum, ControlMarket controlMain, CKernelTerminal kernelTerminal, CStocksVisual stockVisual, CInstrumentConfig instrumentConfig) { StockNum = stockNum; string tickerName = stockVisual.Ticker; IsAlive = true; IsDead = false; SelectionMode = new CSelectionMode(); string tf = instrumentConfig.MarketProperties.ClusterProperties.TimeFrame; _clusterProcessor = new CClusterProcessor(tickerName, tf); _userLevels = new CUserLevels(tickerName); _eventRouterViewModel = new CEventRouterViewModel(this); // int conId = stockVisual.ConNumm; _orders = new OrderData[Params.MaxUserOrdersPerInstr]; _terminalViewModel = CViewModelDispatcher.GetTerminalViewModel(); int parUpdateStockPerSec = kernelTerminal.TerminalConfig.UpdateStockPerSec; _parSleep = (int)(1 / (double)parUpdateStockPerSec * 1000); _instrumentConfig = instrumentConfig; // (new Thread(TestPar)).Start(); GUIDispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher; _controlMarket = controlMain; _kernelTerminal = kernelTerminal; _communicator = kernelTerminal.Communicator; //TextPriceSize = "10"; // StringHeight = "10"; CurrAmountNum = "0"; ListWorkAmount = new List <CWorkAmount>(); SetInstrumentParams(stockVisual); _vmUserPos = new ViewModelUserPos(Decimals, Step); _parMaxVolumeBar = Int32.MaxValue; //RaisePropertyChanged("Contract_ShortName"); ConnId = stockVisual.ConNumm;// conId; MonitorUserOrders = new Dictionary <long, COrder>(); if (tickerName != null) { _logger = new CLogger("MarketViewModel_" + tickerName); } Log("Start logging__________________________________________"); InitBidsAsks(); //TODO remove this.InitializeStockData(); SetMouseMode(true); _threadDataReciever = new Thread(ThreadDataReciever); _threadDataReciever.Start(); //BindWorkAmount(); }
/// <summary> /// Add columns to Grid and adds ControlMarket /// and GridSplitter to Grid. /// /// Call from: /// 1) KernelTerminal.AddAllStocksFromConfig /// 2) KernelTerminal.AddEmptyStockFromButton /// /// </summary> /// <param name="VisualConf">Params from config, if null (call from button) /// do use default params</param> private void CreateStockCell(int stockNum, string ticker, ControlMarket controlMarket, CStocksVisual visualConf = null) { ColumnDefinition colDef = new ColumnDefinition(); colDef.Tag = "ColStock_" + stockNum; GridMarket.ColumnDefinitions.Add(colDef); /* * //2018-05-03 * //Use default params - called from button * if (visualConf == null) * { * double sumWidthStock = 0; * * foreach (UIElement v in GridMarket.Children) * { * * if (v is ControlMarket) * { * ControlMarket currCM = (ControlMarket)v; * foreach (var cd in currCM.GridControlMarket.ColumnDefinitions) * { * if (cd.Name == "ColControlStock") * sumWidthStock += cd.ActualWidth; * * } * * * } * * } * * * * * //Stock Cell * if (stockNum != 0) * { * controlMarket.GridControlMarket.ColumnDefinitions[4].Width = * new GridLength(sumWidthStock / (stockNum)); * * * } * * } * else //use specific params - called from initialization (params from filr) * { * //Clusters cell * controlMarket.GridControlMarket.ColumnDefinitions[0].Width = * new GridLength(visualConf.WidthClusters); * * //Stock Cell * controlMarket.GridControlMarket.ColumnDefinitions[4].Width = * new GridLength(visualConf.WidthStock); * } */ Grid.SetRow(controlMarket, 0); Grid.SetColumn(controlMarket, 2 * stockNum); //KAA changed 2017-03 was stockNum GridMarket.Children.Add(controlMarket); //2017-03-17 add splitter ColumnDefinition colSplitter = new ColumnDefinition(); colSplitter.Width = GridLength.Auto; GridMarket.ColumnDefinitions.Add(colSplitter); GridSplitter splitter = new GridSplitter(); splitter.Width = 1.5; splitter.Background = new SolidColorBrush(Colors.Blue); //TODO DP splitter.HorizontalAlignment = HorizontalAlignment.Stretch; splitter.Tag = stockNum; Panel.SetZIndex(splitter, Int16.MaxValue); Grid.SetRow(splitter, 0); Grid.SetColumn(splitter, 2 * stockNum + 1); GridMarket.Children.Add(splitter); // Canvas.SetZIndex(controlMarket, 10 - stockNum); }