代码之家  ›  专栏  ›  技术社区  ›  CannibalSmith

为什么选择TabControl.SelectedContent!=(TabControl.SelectedItem作为TabItem).Content?

  •  2
  • CannibalSmith  · 技术社区  · 16 年前

    以下示例不应该发出哔哔声(在我看来),但它确实发出哔哔声。为什么?这是不是意味着 SelectedContent 财产没用?是WPF中的bug吗?

    <TabControl SelectionChanged="TabControl_SelectionChanged">
        <TabItem Header="Tab 1">
            <Grid/>
        </TabItem>
        <TabItem Header="Tab 2">
            <Grid/>
        </TabItem>
    </TabControl>
    

    void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var t = sender as TabControl;
        if (t.SelectedContent != (t.SelectedItem as TabItem).Content) Console.Beep();
    }
    
    2 回复  |  直到 16 年前
        1
  •  3
  •   Dabblernl    16 年前

    我做了一些测试,发现SelectedContent属性已设置 之后 之前 活动已启动。!

    将其中一个网格更改为Stackpanel,并在if子句上设置断点。。。

        2
  •  1
  •   Kirill Osenkov    10 年前

    它看起来确实像WPF中的一个bug。在本规范中: http://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/TabControl.cs,342 它首先呼叫 base.OnSelectionChanged (这提高了 SelectionChanged 事件),然后尝试将焦点设置为选定的 TabItem UpdateSelectedContent ,这实际上设置了 SelectedContent

    所以是的 选择已更改 这件事有点没用。一个好的解决方法是订阅 选定内容 相关性属性值已更改:

    var dp = DependencyPropertyDescriptor.FromProperty(TabControl.SelectedContentProperty, typeof(TabControl));
    dp.AddValueChanged(tabControl, OnTabControlSelectedContentChanged);
    

    OnTabControlSelectedContentChanged 你会注意到它是在 选择已更改 ,到那时内容应该会更新。不要忘记手动设置新内容的焦点(因为WPF设置焦点的尝试失败了)。要设置焦点,可能需要 Dispatcher.BeginInvoke