C# WPF GridSplitter-如何禁用鼠标拖动和键盘调整大小

C# WPF GridSplitter-如何禁用鼠标拖动和键盘调整大小,c#,wpf,C#,Wpf,我已经基于一些博客源实现了一个网格拆分器,它基本上允许基于双击事件展开/折叠 拆分器位于网格的两列之间,这两列表示屏幕布局,左侧为NavigationPanel,右侧为MainContentPanel,拆分器允许NavigationPanel折叠到仅显示图标的最小宽度 在允许拖动拆分器和键盘调整时,是否有办法禁用网格拆分器的默认行为 我目前的解决办法如下 通过将Focusable设置为False禁用键盘调整 防止用户“抓取”拆分器,方法是将ToggleButton控件置于与GridSplitt

我已经基于一些博客源实现了一个网格拆分器,它基本上允许基于双击事件展开/折叠

拆分器位于网格的两列之间,这两列表示屏幕布局,左侧为NavigationPanel,右侧为MainContentPanel,拆分器允许NavigationPanel折叠到仅显示图标的最小宽度

在允许拖动拆分器和键盘调整时,是否有办法禁用网格拆分器的默认行为

我目前的解决办法如下

  • 通过将Focusable设置为False禁用键盘调整
  • 防止用户“抓取”拆分器,方法是将ToggleButton控件置于与GridSplitter相同的控件上方,从而使该按钮拦截所有鼠标单击

我有一个版本,完全不使用切换按钮,只处理GridSplitter上的双击事件,但问题是我找不到禁用鼠标拖动功能的方法。

我发现的另一种方法是为DragDeltaEvent添加一个处理程序,然后将其标记为已处理

public class ExtendedGridSplitter : GridSplitter
{
...
    public ExtendedGridSplitter()
    {
        EventManager.RegisterClassHandler(typeof(ExtendedGridSplitter), Thumb.DragDeltaEvent,
            new DragDeltaEventHandler(OnDragDelta));
    }

...
    private void OnDragDelta(object sender, DragDeltaEventArgs e)
    {        
        e.Handled = true;           
    }
}
对于键盘事件,覆盖处理程序的工作方式类似

protected override void OnKeyDown(KeyEventArgs e)
{  
    e.Handled = true;
}

老实说,我不明白为什么要这样做,但如果真的要禁用鼠标和键盘输入,只需将
IsEnabled
设置为false即可。正如您已经发现的,如果您只想禁用键盘输入,请将
Focusable
设置为false-这就是我来到这里的原因,我想弄清楚:)

一个简单的解决方案对我有效(尽管不是很漂亮),就是将MaxWidth和MinWidth设置为相同的值。在我的例子中,当用户选择关闭窗口并在侧边栏中显示“重新显示”图标时,我想关闭拆分器的使用。
不幸的是,MouseWE夹持器仍然亮起,但它们无能为力。

为什么要使用gridsplitter?如果不使用默认行为,为什么要使用gridsplitter?带有切换按钮的扩展器应该足够了。我有一个网格应用程序,其中列0是导航面板,列1是拆分器,列2是主内容面板。其想法是,您应该能够将导航面板折叠到只显示图标的最小尺寸(即不完全隐藏它)。我没有尝试使用扩展器,因为我认为这会扩展或折叠整个面板,这是我不想要的。这似乎不起作用,至少在所有列都没有使用
*
大小调整时是这样。由于WPF中的
*
大小调整错误,我正在尝试自己进行计算。有趣的想法是,不幸的是GridSplitter控件似乎忽略了IsEnabled值。不知道为什么?