WPF TabControl Page 新增、关闭、传参、刷新

2021-01-16 21:11

阅读:693

标签:reac   for   因此   tac   命令   date   服务器   comment   timer   

原文:WPF TabControl Page 新增、关闭、传参、刷新

一、tabcontrol

  1. "0" x:Name="tbc_main" ItemsSource="{Binding DataList,Mode=OneWay}" SelectedIndex="{Binding TabSelectedIndex}">
  2. "Horizontal" Margin="0" Height="28">
  3. "{Binding Header}" Margin="10,7,0,0"/>
  4. Background="{x:Null}" Command="{Binding DataContext.CloseTabCommand,ElementName=tbc_main}" CommandParameter="{Binding ElementName=btn_close}"
  5. Padding="0" >
  6. "{Binding Content}">

一、新增

  1. ///
  2. /// 新增页面命令:传递参数
  3. ///
  4. public RelayCommandstring> AddTabItemCommand =>
  5. new Lazystring>>(() =>
  6. new RelayCommandstring>(AddTabItem)).Value;
  7. ///
  8. /// 添加新页面
  9. ///
  10. /// 菜单关联新页面参数
  11. private void AddTabItem(string param)
  12. {
  13. JObject obj = (JObject)JsonConvert.DeserializeObject(param);
  14. string header = obj["header"].ToString();
  15. string url = obj["url"].ToString();
  16. Boolean isNew = true;
  17. int i = 0;
  18. for (i = 0; i
  19. {
  20. if (string.Equals(DataList[i].Header, header))
  21. {
  22. isNew = false;
  23. break;
  24. }
  25. }
  26. if (isNew)
  27. {
  28. Frame fm = new Frame();
  29. fm.Source = new Uri(url, UriKind.Relative);
  30. DataList.Add(new TabControlModel
  31. {
  32. Header = header,
  33. Content = fm
  34. });
  35. TabSelectedIndex = DataList.ToArray().Length - 1;
  36. }
  37. else
  38. {
  39. TabSelectedIndex = i;
  40. return;
  41. }
  42. }
  43. 二、关闭tab

    1. ///
    2. /// 关闭tab
    3. ///
    4. public RelayCommand
    5. new Lazy>(() =>
    6. new RelayCommand
    7. public void CloseTab(Button btn)
    8. {
    9. TabItem tbc = FindParentTabControl(btn);
    10. foreach (TabControlModel item in DataList)
    11. {
    12. if (item.Equals(tbc.Content))
    13. {
    14. DataList.Remove(item);
    15. break;
    16. }
    17. }
    18. }
    19. ///
    20. /// 递归找父级TabControl
    21. ///
    22. /// 依赖对象
    23. /// TabControl
    24. private TabItem FindParentTabControl(DependencyObject reference)
    25. {
    26. DependencyObject dObj = VisualTreeHelper.GetParent(reference);
    27. if (dObj == null)
    28. return null;
    29. if (dObj.GetType() == typeof(TabItem))
    30. return dObj as TabItem;
    31. else
    32. return FindParentTabControl(dObj);
    33. }

    三、刷新

    viewmodel和ViewModelLocator增加时间参数传递

    1. public PIndexViewModel(string dateTime)
    2. {
    3. MenuList = GetMenuList();
    4. MenuSelectedIndex = 0;
    5. DataList = GetTabControlDataList();
    6. //接收其他页面传递的消息,第二个参数为消息key,控制接收对象
    7. Messenger.Default.Register(this, "AddTab", ReceiveInfo);
    8. DateShow();
    9. timer = new DispatcherTimer();
    10. timer.Interval = TimeSpan.FromSeconds(1);
    11. timer.Tick += new EventHandler(TimerTick);
    12. timer.Start();
    13. }
    1. SimpleIoc.Default.Register(() => new PIndexViewModel(DateTime.Now.ToString("HH:mm:ss")));
    2. public PIndexViewModel PIView
    3. {
    4. get
    5. {
    6. return ServiceLocator.Current.GetInstance(DateTime.Now.ToString("HH:mm:ss"));
    7. }
    8. }

    四、传参

    WPF程序是客户端程序,也就是说每个用户在自己的机器上启动的WPF程序,这些程序是互相独立的,因此不会出现多个用户同时访问的问题。

    表单传值和querystring[]传值的方法是因为ASP.NET背后的HTTP协议是无状态协议,因此需要在不同的页面之间(因为Web服务器不会记住各页面的状态)传递信息。 而WPF程序里面的各个page都是运行在同一个进程空间内,共享同一块内存,所以用Application.Current.Properties就可以了。

    1. private void Jt(string param)
    2. {
    3. //给接谈传递页面参数
    4. Application.Current.Properties["pjt"] = param;
    5. SendInfo = "{ \"header\":\"测试\" , \"url\":\"/Pages/PJt.xaml\" }";
    6. //消息传递给PindexModel接收,打开新的页面,第二个参数为消息key,控制接收对象
    7. Messenger.Default.Send(SendInfo, "AddTab");
    8. }
    1. public PJtViewModel(string dateTime)
    2. {
    3. string param=(string)Application.Current.Properties["pjt"];
    4. Model = GetXfInfo(param);
    5. GetXfjPcCount(Model);
    6. //接收其他页面传递的消息,第二个参数为消息key,控制接收对象
    7. Messenger.Default.Register(this, "Xfpc_xtxfsx", ReceiveXfpcXtxfsx);
    8. Messenger.Default.Register(this, "Xfpc_sqyy", ReceiveXfpcSqyy);
    9. Messenger.Default.Register(this, "Xfpc_ccxf", ReceiveXfpcCcxf);
    10. Messenger.Default.Registerstring[]>(this, MsgTypes.列表信息控制_Callback, res =>
    11. {
    12. switch (res[0])
    13. {
    14. case "GKXX":
    15. Model.Zysshtml = res[1];
    16. break;
    17. }
    18. });
    19. }

     

    WPF TabControl Page 新增、关闭、传参、刷新

    标签:reac   for   因此   tac   命令   date   服务器   comment   timer   

    原文地址:https://www.cnblogs.com/lonelyxmas/p/12208817.html


评论


亲,登录后才可以留言!

推荐文章

最新文章

置顶文章