【问题标题】:tabcontrol selectionchanged event -- e.source issuetabcontrol selectionchanged 事件——e.source 问题
【发布时间】:2014-08-13 14:29:07
【问题描述】:

我是 WPF 的新手,当用户在我的 tabcontrol 项目之间切换时,我想做一些事情。 正如所料,我遇到了多次触发 selectionchanged 事件的问题,然后我阅读了这篇文章:

In C# WPF, why is my TabControl's SelectionChanged event firing too often?,

我不喜欢第一个解决方案,它需要太多额外代码来处理应用程序中每个选择器的事件。因此,我尝试了这篇文章中的解决方案:

TabControl's SelectionChanged event issue,

但我遇到了一个新问题,我在 stackoverflow 中找不到任何相关帖子。

我遇到的问题是下面的代码没有返回 true:

if (e.Source is TabControl){ // do something }

没有这个:

if (e.Source is TabItem) {// do something}

当我在调试模式下将鼠标悬停在 e.Source 上时,它显示为

{System.Windows.Controls.TabControl Items.Count:5}

如果我尝试在 WPF Tree Visualizer 中查看它,它会告诉我这是我期望的 TabControl。

所以我的问题是,为什么它不返回 true,因为它是 TabControl?

这是我的 SelectionChanged 代码:

    void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.Source is TabControl)
        {
            if (item1.IsSelected)
            {
                myllist1.DataContext = getList1();
            }
            else if (item2.IsSelected)
            {
                mylist2.DataContext = getlist2();
            }
            else if (item3.IsSelected)
            {
                mylist3.DataContext = getlist3();
            }
            else if (item4.IsSelected)
            {
                mylist4.DataContext = getlist4();
            }
        }
    }

【问题讨论】:

  • 您是否尝试使用“sender”而不是“e.Source”?
  • @Xcalibur37 请看我对答案#2的回复

标签: c# wpf events tabcontrol


【解决方案1】:

您必须将 e.source 从 Object 转换为 FrameworkElement,然后比较类型。

if (((FrameworkElement)e.Source).GetType()== typeof(System.Windows.Controls.TabControl))
  {
   if (item1.IsSelected)
        {
            myllist1.DataContext = getList1();
        }
        else if (item2.IsSelected)
        {
            mylist2.DataContext = getlist2();
        }
        else if (item3.IsSelected)
        {
            mylist3.DataContext = getlist3();
        }
        else if (item4.IsSelected)
        {
            mylist4.DataContext = getlist4();
        }
  }

【讨论】:

  • 顺便说一句,我只是好奇,在我读过的所有帖子中,没有人提出这个问题,所以我猜它们在没有转换的情况下都运行良好?
  • 他们可能在 tabitems 上没有其他控件来冒泡 selectionchanged 事件(这是问题),或者他们可能在每个冒泡到该事件的控件上设置了 e.handled=true 以便它永远不会到达容器事件。不过,我很高兴能帮上忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多