一、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;
                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;
                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
                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;
                    一、tabcontrol&lt;TabControl Grid.Row="0" x:Name="tbc_main" ItemsSource="{Binding DataList,Mode=OneWay}" SelectedIndex="{Binding TabSelectedIndex}"&gt;                &lt;TabControl.ItemTemplate&gt;...
虽然说是自适应可关闭TabControl,但TabControl并不需要改动,不如叫自适应可关闭的TabItem.
大体思路:建一个用户控件,继承自TabItem,里面放个按钮,点击的时候在TabControl中移除自身.在添加,移除TabItem和TabControl尺寸变化时,通过Items的个数计算合适的Width.
新建用户控件
新建用户控件,并继承自Tab...
二、创建带有关闭功能的TabItem继承控件CloseableTabItem
  1、选择自定件控件选项建立 CloseableTabItem 派生自TabItem,并注册一个名称为CloseTab 的路由事件
2、为CloseTabItem创建资源字典CloseableTabItemStyle.xaml
3、App.xaml中引用该字典...
				
最近在处理一个功能:在page页面加载时导入已有配置,在page页面被关闭时也要相应更新修改过的配置。 初步解决方案,当然是响应此page的loaded事件和unloaded事件,如下: private void Page_Loaded(object sender, RoutedEventArgs e) string strXmlFi
以前写的演示,不过没什么用了现在流行双击关闭选项卡简单还 private void TabDraw_Load(object sender, System.EventArgs e) //设置若干属性 tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed; tabControl1.Padding = new System.Drawing.Point(CLOSE <ItemsControl ItemsSource="{Binding MenuList}" x:Name="itemsControl"> <ItemsControl.ItemTemplate> <DataTemplate>
WPFTabControl 中没有直接提供关闭按钮的选项。但是,可以通过自定义 ItemTemplate 实现一个关闭按钮。 首先,在 TabControl 中设置 TabStripPlacement 属性为 Top,这将使 TabItem 的头部显示在顶部。 然后,我们可以在 TabControl 中定义一个 ItemTemplate,用于自定义每个 TabItem 的外观。在这个 ItemTemplate 中,可以添加一个按钮,并对按钮的点击事件进行处理。 下面是一个示例的 XAML 代码: <TabControl TabStripPlacement="Top"> <TabControl.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Header}" Margin="0,0,5,0"/> <Button Content="X" Click="CloseButton_Click"/> </StackPanel> </DataTemplate> </TabControl.ItemTemplate> <!-- TabItems go here --> </TabControl> 在这个示例中,通过一个 StackPanel 将 TabItem 的标题和关闭按钮放在一行,其中 TextBlock 用于显示标题,Button 用于关闭按钮。然后,通过指定 Click 事件的处理方法实现关闭功能。 在代码中,你需要实现 CloseButton_Click 事件的处理方法。这个方法可以从 TabControl 的 Items 集合中移除当前选中的 TabItem。 private void CloseButton_Click(object sender, RoutedEventArgs e) Button closeButton = (Button)sender; TabItem tabItem = (TabItem)closeButton.DataContext; tabControl.Items.Remove(tabItem); 以上就是如何在 WPFTabControl 中添加关闭按钮的简单示例。希望可以帮助到你。
intellij idea java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet 35874 intellij idea java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet QWEIOPx: 看一个另一篇文章看懂的,简单来说就是WEB-INF下面没有lib文件夹,对于wbe项目来说就没有jar支持。 https://www.cnblogs.com/qianzf/p/12296246.html 分享一下自己的解决方法:在WEB-INF下面新加了一个lib文件夹,然后再项目构造那边把旧的Artifact删掉,重新导入,RunConfig那边我也重新弄了一下表情包 不过疑问的是,这样做可以运行,但lib下也没有东西,不过out/Artifacts下面生成war包是有相应jar包。 Subresource Integrity 介绍--SRI (Subresource Integrity) 的检查 寇林2019: 在线生成工具:https://www.xftsoft.com/tool/integrity 80端口被system(pid=4)占用的解决方法 ༄邪殿࿐ེ: 表情包用services.msc,里面找不到SQL Server Reporting Services(MSSQLSERVER),这是什么情况表情包