XAML ToolTip + IsHitTestVisible =“False”

时间:2010-05-05 14:22:08

标签: c# wpf user-interface xaml

我们的View1需要鼠标点击和拖动“忽略”,但工具提示仍必须在该视图中运行。原因是View1在Z-Order中高于View2,因此View1可以将View2着色为红色并通过ToolTip显示警告;但是,如果IsHitTestVisible =“False”,View1附带的工具提示将不起作用。

任何人都知道一个解决方法,因此工具提示将在鼠标移动/结束时显示,其余的鼠标事件将被View1忽略并转到View2?

谢谢,

肖恩

3 个答案:

答案 0 :(得分:2)

我所做的并不是很好:

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        var parentWindow = Window.GetWindow(this);
        var source = PresentationSource.FromVisual(parentWindow) as HwndSource;

        source.AddHook(WndProc);
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        // Handle messages... 
        if (msg == WM_MOUSEMOVE)
        {
        ...show tool tip if mouse is over it
        }
        return IntPtr.Zero;
    }

答案 1 :(得分:2)

如果其他人遇到同样的问题,他们可能会觉得有帮助。 我们要求在datagrid上禁用几行,但同时允许对它们进行ARROW键导航。这就是我们必须切换到IsEnabled而不是控制IsEnabled属性的原因。所以我们不能采用上述切换到RowEnable属性的解决方案。

以下是我最终解决此问题的方法。我为DataGridRow创建了一个新的附加属性virtual。此附加属性可以绑定到viewmodel属性以控制DataGridCell启用和禁用。我还为IsHitTestVisible创建了一种新样式,我根据相同的viewmodel属性将false设置为RowEnabled。因此,请将其视为鼠标/键盘可以看到的行,但无法看到其单元格/列。这意味着现在我可以根据新的附加属性<ItemGroup> <None Include="somefile.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> 设置行的样式,使其看起来已禁用/启用。同时,我可以查看几乎禁用的这些拖动的工具提示。

希望这会有所帮助!!

答案 2 :(得分:0)

请勿设置IsHitTestVisible="False"

只需添加这些行

IsEnable = false
ToolTipService.ShowOnDisabled="True"