private TabItem GenerateActorTabItem(Staff staff) { // Create view model for node network. NetworkViewModel model = new NetworkViewModel(); // If this actor has at least one cut... if (staff.FirstCut != null) { staff.FirstCut.NodeViewModel.CreateNodesRecursive(model, null); } else { BeginNodeViewModel begin_node = new BeginNodeViewModel(staff); model.Nodes.Edit(x => x.Add(begin_node)); } // Create the visual component of the node network. NetworkView v = new NetworkView() { HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch, VerticalAlignment = System.Windows.VerticalAlignment.Stretch, HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch, VerticalContentAlignment = System.Windows.VerticalAlignment.Stretch, ViewModel = model }; v.ContextMenu = new ActorTabContextMenu(staff); v.Events().LayoutUpdated .Where(_ => v.ViewModel != null && v.ViewModel.Nodes.Count > 0) .Select(_ => v.ViewModel.Nodes.Items.Last().Size) .Where(size => size.Width > 0 && size.Height > 0) .FirstAsync() .Subscribe(size => { ArrangeNodes(model); }); model.SelectedNodes.Connect().Subscribe(d => { OnSelectedNodesChanged(d); }); m_StaffNodeViews.Add(v); // Finally, create the new tab. TabItem new_tab = new TabItem() { Header = staff.Name, Content = v }; ContextMenu TabContext = new ContextMenu(); TabContext.Items.Add(new MenuItem() { Header = "Remove Actor", Command = RemoveStaffCommand, CommandParameter = new Tuple <TabItem, Staff>(new_tab, staff) }); new_tab.ContextMenu = TabContext; return(new_tab); }