【问题标题】:WPF GridSplitter - How to disable mouse drag and keyboard resizeWPF GridSplitter - 如何禁用鼠标拖动和键盘调整大小
【发布时间】:2014-03-07 01:35:46
【问题描述】:

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

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

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

我目前的解决方法如下

  • 通过将 Focusable 设置为 False 来禁用键盘调整
  • 通过将 ToggleButton 控件放置在与 GridSplitter 相同的上方,防止用户“抓住”拆分器,从而使按钮拦截所有鼠标点击。

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

【问题讨论】:

  • 你为什么要使用 gridsplitter?
  • 如果不使用默认行为,为什么要使用 GridSplitter?一个带有 ToggleButton 的扩展器就足够了。
  • 我有一个带有网格的应用程序,其中第 0 列是 NavigationPanel,第 1 列是拆分器,第 2 列是 MainContentPanel。这个想法是您应该能够将 NavPanel 折叠到仅显示图标的最小尺寸(即不完全隐藏它)。我没有尝试使用扩展器,因为我认为这会扩展或折叠整个面板,这是我不想要的。

标签: c# wpf


【解决方案1】:

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

【讨论】:

  • 有趣的想法,不幸的是 GridSplitter 控件似乎忽略了 IsEnabled 值。不知道为什么?
【解决方案2】:

我发现的另一种方法是为 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;
}

【讨论】:

  • 这似乎不起作用,至少当所有列都没有使用 * 大小时。由于 * WPF 中的大小错误,我正在尝试自己进行计算。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多