WPF TabControl Page 新增关闭传参刷新
Posted lonelyxmas
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF TabControl Page 新增关闭传参刷新相关的知识,希望对你有一定的参考价值。
原文:WPF TabControl Page 新增、关闭、传参、刷新
一、tabcontrol
- <TabControl Grid.Row="0" x:Name="tbc_main" ItemsSource="{Binding DataList,Mode=OneWay}" SelectedIndex="{Binding TabSelectedIndex}">
- <TabControl.ItemTemplate>
- <DataTemplate>
- <StackPanel Orientation="Horizontal" Margin="0" Height="28">
- <TextBlock Text="{Binding Header}" Margin="10,7,0,0"/>
- <Button x:Name="btn_close" Content="×" BorderBrush="Transparent" Width="16" Cursor="Hand" Margin="10,0,0,0"
- Background="{x:Null}" Command="{Binding DataContext.CloseTabCommand,ElementName=tbc_main}" CommandParameter="{Binding ElementName=btn_close}"
-
- Padding="0" >
- </Button>
- </StackPanel>
- </DataTemplate>
- </TabControl.ItemTemplate>
- <TabControl.ContentTemplate>
- <DataTemplate>
- <ContentControl Content="{Binding Content}"></ContentControl>
- </DataTemplate>
- </TabControl.ContentTemplate>
- </TabControl>
一、新增
- /// <summary>
- /// 新增页面命令:传递参数
- /// </summary>
- public RelayCommand<string> AddTabItemCommand =>
- new Lazy<RelayCommand<string>>(() =>
- new RelayCommand<string>(AddTabItem)).Value;
-
- /// <summary>
- /// 添加新页面
- /// </summary>
- /// <param name="param">菜单关联新页面参数</param>
- private void AddTabItem(string param)
- {
- JObject obj = (JObject)JsonConvert.DeserializeObject(param);
- string header = obj["header"].ToString();
- string url = obj["url"].ToString();
- Boolean isNew = true;
- int i = 0;
- for (i = 0; i < DataList.Count; i++)
- {
- if (string.Equals(DataList[i].Header, header))
- {
- isNew = false;
- break;
- }
- }
- if (isNew)
- {
- Frame fm = new Frame();
- fm.Source = new Uri(url, UriKind.Relative);
- DataList.Add(new TabControlModel
- {
- Header = header,
- Content = fm
- });
- TabSelectedIndex = DataList.ToArray().Length - 1;
- }
- else
- {
-
- TabSelectedIndex = i;
- return;
- }
- }
二、关闭tab
- /// <summary>
- /// 关闭tab
- /// </summary>
- public RelayCommand<Button> CloseTabCommand =>
- new Lazy<RelayCommand<Button>>(() =>
- new RelayCommand<Button>(CloseTab)).Value;
-
- public void CloseTab(Button btn)
- {
- TabItem tbc = FindParentTabControl(btn);
- foreach (TabControlModel item in DataList)
- {
- if (item.Equals(tbc.Content))
- {
- DataList.Remove(item);
- break;
- }
- }
- }
-
- /// <summary>
- /// 递归找父级TabControl
- /// </summary>
- /// <param name="reference">依赖对象</param>
- /// <returns>TabControl</returns>
- private TabItem FindParentTabControl(DependencyObject reference)
- {
- DependencyObject dObj = VisualTreeHelper.GetParent(reference);
- if (dObj == null)
- return null;
- if (dObj.GetType() == typeof(TabItem))
- return dObj as TabItem;
- else
- return FindParentTabControl(dObj);
- }
三、刷新
viewmodel和ViewModelLocator增加时间参数传递
- public PIndexViewModel(string dateTime)
- {
- MenuList = GetMenuList();
- MenuSelectedIndex = 0;
- DataList = GetTabControlDataList();
-
- //接收其他页面传递的消息,第二个参数为消息key,控制接收对象
- Messenger.Default.Register<String>(this, "AddTab", ReceiveInfo);
-
- DateShow();
- timer = new DispatcherTimer();
- timer.Interval = TimeSpan.FromSeconds(1);
- timer.Tick += new EventHandler(TimerTick);
- timer.Start();
- }
- SimpleIoc.Default.Register(() => new PIndexViewModel(DateTime.Now.ToString("HH:mm:ss")));
-
- public PIndexViewModel PIView
- {
- get
- {
- return ServiceLocator.Current.GetInstance<PIndexViewModel>(DateTime.Now.ToString("HH:mm:ss"));
- }
- }
四、传参
WPF程序是客户端程序,也就是说每个用户在自己的机器上启动的WPF程序,这些程序是互相独立的,因此不会出现多个用户同时访问的问题。
表单传值和querystring[]传值的方法是因为ASP.NET背后的HTTP协议是无状态协议,因此需要在不同的页面之间(因为Web服务器不会记住各页面的状态)传递信息。 而WPF程序里面的各个page都是运行在同一个进程空间内,共享同一块内存,所以用Application.Current.Properties就可以了。
- private void Jt(string param)
- {
- //给接谈传递页面参数
- Application.Current.Properties["pjt"] = param;
- SendInfo = "{ "header":"测试" , "url":"/Pages/PJt.xaml" }";
- //消息传递给PindexModel接收,打开新的页面,第二个参数为消息key,控制接收对象
- Messenger.Default.Send<String>(SendInfo, "AddTab");
-
- }
- public PJtViewModel(string dateTime)
- {
- string param=(string)Application.Current.Properties["pjt"];
- Model = GetXfInfo(param);
- GetXfjPcCount(Model);
-
- //接收其他页面传递的消息,第二个参数为消息key,控制接收对象
- Messenger.Default.Register<String>(this, "Xfpc_xtxfsx", ReceiveXfpcXtxfsx);
- Messenger.Default.Register<String>(this, "Xfpc_sqyy", ReceiveXfpcSqyy);
- Messenger.Default.Register<String>(this, "Xfpc_ccxf", ReceiveXfpcCcxf);
-
-
-
- Messenger.Default.Register<string[]>(this, MsgTypes.列表信息控制_Callback, res =>
- {
- switch (res[0])
- {
- case "GKXX":
- Model.Zysshtml = res[1];
- break;
- }
- });
- }
以上是关于WPF TabControl Page 新增关闭传参刷新的主要内容,如果未能解决你的问题,请参考以下文章
WPF自适应可关闭的TabControl 类似浏览器的标签页(转)