Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止ScrollViewer处理子代的MouseMove事件?(适用于Windows Phone的Silverlight)_Silverlight_Scrollviewer_Mousemove_Event Bubbling - Fatal编程技术网

如何防止ScrollViewer处理子代的MouseMove事件?(适用于Windows Phone的Silverlight)

如何防止ScrollViewer处理子代的MouseMove事件?(适用于Windows Phone的Silverlight),silverlight,scrollviewer,mousemove,event-bubbling,Silverlight,Scrollviewer,Mousemove,Event Bubbling,考虑这一点: <ScrollViewer> <!-- Several Controls /--> <MyControl MouseMove="myMouseMoveHandler" /> <!-- Several Controls /--> </ScrollViewer> MyControl是一个HSV颜色选择控件,其颜色光谱位于可以旋转的圆上,所选色调的细微差别位于三角形上。它看起来棒极了,但遗憾的是我还不能发布

考虑这一点:

<ScrollViewer>
  <!-- Several Controls /-->

  <MyControl MouseMove="myMouseMoveHandler" />

  <!-- Several Controls /-->
</ScrollViewer>

MyControl是一个HSV颜色选择控件,其颜色光谱位于可以旋转的圆上,所选色调的细微差别位于三角形上。它看起来棒极了,但遗憾的是我还不能发布图片(rep)。它确实需要能够在其表面上处理鼠标在各个方向的移动

现在,当我在MyControl上移动鼠标时(它正确地处理了移动),ScrollViewer仍然会滚动

即使它是ScrollViewer中的唯一控件,移动在我的控件中开始和结束,和/或我在MouseLeftButtonDown/-Up事件中设置e.Handled=true,也会发生这种情况。在..Down中使用CaptureMouse()并在..Up中释放MouseCapture()也没有帮助

您会同意,我不能更改ScrollViewer实现(或者我可以吗?),并且我不能保证我的控件从未托管在ScrollViewer中(例如,因为我想发布它)

必须能够防止ScrollViewer获得鼠标移动。证明:只需将MyControl替换为包含超出其高度范围的项目的列表框,您就可以在没有ScrollViewer响应的情况下浏览列表框项目


但是怎么做呢?它也是列表框中的一个滚动查看器,这就是它在那里工作的原因,或者它也可以用于我的控件吗?

好的,我找到了一个很好的解决方案

我的想法是如此的固定在e.Handled(在MouseMove中不可用)、IshitteVisible(将所有孩子都隐藏在触摸事件之外)和诸如此类的东西上,我没有看到明显的东西

下面是代码,以防有人有相同的问题:

struct ScrollVisibilities
{
    public ScrollBarVisibility Horizontal;
    public ScrollBarVisibility Vertical;
}

Dictionary<ScrollViewer, ScrollVisibilities> scrollersStates = new Dictionary<ScrollViewer, ScrollVisibilities>();

bool scrollersDisabled;

void disableScrollViewers(bool disable)
{
    if (scrollersDisabled == disable)   // can't disable if disabled or enable if enabled
        return;
    scrollersDisabled = disable;

    if (disable)
    {
        DependencyObject dpo = Parent;
        while (dpo is FrameworkElement)
        {
            if (dpo is ScrollViewer)
            {
                ScrollViewer s = dpo as ScrollViewer;
                ScrollVisibilities v = new ScrollVisibilities()
                {
                    Horizontal = s.HorizontalScrollBarVisibility,
                    Vertical = s.VerticalScrollBarVisibility
                };
                scrollersStates.Add(s, v);
                s.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
                s.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
            }
            dpo = ((FrameworkElement)dpo).Parent;
        }
    }
    else // restore
    {
        foreach (ScrollViewer s in scrollersStates.Keys)
        {
            s.HorizontalScrollBarVisibility = scrollersStates[s].Horizontal;
            s.VerticalScrollBarVisibility = scrollersStates[s].Vertical;
        }
        scrollersStates.Clear();
    }
}
struct scroll可视性
{
公众视野水平;
公众视野垂直;
}
字典滚动状态=新字典();
禁用布尔滚动条;
void disableScrollViewer(bool disable)
{
if(scrollersDisabled==disable)//禁用时不能禁用,启用时启用
返回;
scrollersDisabled=禁用;
如果(禁用)
{
DependencyObject dpo=父对象;
while(dpo是框架元素)
{
如果(dpo是ScrollViewer)
{
ScrollViewer s=dpo作为ScrollViewer;
ScrollVisibilities v=新的ScrollVisibilities()
{
水平=s.水平滚动条可见性,
垂直=s.VerticalScrollbar可见性
};
滚动状态。添加(s,v);
s、 HorizontalScrollBarVisibility=ScrollBarVisibility.Disabled;
s、 VerticalScrollBarVisibility=ScrollBarVisibility.Disabled;
}
dpo=((FrameworkElement)dpo.Parent;
}
}
else//restore
{
foreach(ScrollerStates.Keys中的ScrollViewer s)
{
s、 HorizontalScrollBarVisibility=ScrollerStates[s]。水平;
s、 VerticalScrollBarVisibility=ScrollerStates[s]。垂直;
}
scrollerstates.Clear();
}
}
在MouseLeftButtonDown中,我禁用了ScrollViewer(true),并挂接到Touch.FrameReported。 在Touch_FrameReported中,当所有触摸点都有Action==Up时,我禁用ScrollViewer(false)。这样,即使在MyControl之外发生,我也会得到Up事件

这种方法有一些限制,因为禁用ScrollViewer会导致他们跳转到(和他们的孩子)未滚动的状态。因此,我将MyControl放在顶部,并相应地设置所有对齐