WPF TabControl 如何在鼠标向上而不是鼠标向下更改选项卡?

Posted

技术标签:

【中文标题】WPF TabControl 如何在鼠标向上而不是鼠标向下更改选项卡?【英文标题】:WPF TabControl How to change Tab on mouse up rather than mouse down? 【发布时间】:2011-09-06 12:22:29 【问题描述】:

在 WPF TabControl 中,默认行为是在鼠标按下时更改选定的选项卡。

在我的应用程序中,更改选项卡有时会调整大小,有时会在另一个用户控件上调用鼠标向上事件,因为选项卡控件已移动。

如果我可以将标签页设置为仅在鼠标向上而不是鼠标向下时切换,它将解决问题。

【问题讨论】:

【参考方案1】:

您可以像这样使用自定义 TabItem:

public class MyTabItem : TabItem 

    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
        if (e.Source == this || !this.IsSelected)
            return;

        base.OnMouseLeftButtonDown(e);
    

    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) 
        if (e.Source == this || !this.IsSelected)
            base.OnMouseLeftButtonDown(e); // OR just this.Focus(); OR this.IsSeleded = true;

        base.OnMouseLeftButtonUp(e);
    

【讨论】:

【参考方案2】:

您可以订阅 PreviewMouseDown 事件并设置路由事件的 Handled 标志以禁用 mousedown,然后在 MouseUp 上您可以在 TabItem 上设置 IsSelected。这样您就不必创建自定义控件。

XAML

<TabItem Header="My Tab" MouseUp="TabItem_MouseUp" PreviewMouseDown="TabItem_PreviewMouseDown">
    <!--Content-->
</TabItem>

C#

private void TabItem_MouseUp(object sender, MouseButtonEventArgs e)

    if (sender is TabItem tab && !tab.IsSelected)
        tab.IsSelected = true;
//end private void TabItem_MouseUp(object sender, MouseButtonEventArgs e)

private void TabItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)

    if (sender is TabItem tab && !tab.IsSelected)
        e.Handled = true;
//end private void TabItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)

【讨论】:

以上是关于WPF TabControl 如何在鼠标向上而不是鼠标向下更改选项卡?的主要内容,如果未能解决你的问题,请参考以下文章

WPF TabControl 标头问题

WPF多行TabControl而不重新排列行

WPF是不是有鼠标滚轮上下滚动事件

xaml / wpf TabControl如何使用屏幕的100%拉伸

WPF 控件库——可拖动选项卡的TabControl

wpf 实现多个选项卡左右移动