none
发现了一个SilverLight3的一个小bug,各位可以讨论一下 RRS feed

  • 常规讨论

  • 今天在写程序,时候使用到了VisualTreeHelper对象的FindElementsInHostCoordinations(Point p, UIElement subtree)方法以获取在Canvs上鼠标单击的控件。结果发现使用相对于Canvs的坐标竟然获取不到单击的地方,在此我已经排除了坐标点转换的错误。具体情况如下:
    平台:SilverLight 3 Visual Studio 2008
    系统:Windows XP SP3
    public MainPage()
    {
       InitializeComponent();
       HtmlPage.Document.AttachEvent("oncontextmenu", OnContext);
    }
    		
    private void OnContext(object sender, HtmlEventArgs e)
    {
       GeneralTransform generalTransform = Application.Current.RootVisual.TransformToVisual(this.c);
       Point p = generalTransform.Transform(new Point(e.ClientX, e.ClientY));
       IEnumerable<UIElement> elements = VisualTreeHelper.FindElementsInHostCoordinates(p, this.c);
       TextBlock t = new TextBlock();
       t.Text = p.ToString();
       t.Margin = new Thickness(p.X, p.Y, 0, 0);
       this.c.Children.Add(t);
    }
    当我把VisualTreeHelper.FindElementsInHostCoordinates(p, this.c)中的坐标点改为new Point(e.ClientX, e.ClientY))使就可以获取到鼠标右击的控件了。但是,SilverLight3的文档中明明是说要使用相对于UIElement的坐标呀,为什么在此需要全局坐标呢?为了验证我的疑问,我又把同样的程序在WPF中实现了一边,结果是需要使用UIElement的坐标可以获取鼠标右击的控件,使用全局坐标则获取不到鼠标右击的控件,此点是符合MSDN文档中的说明的。还有一点我没有搞明白,为什么当我把一个控件的背景色设置为Non Brush时无论使用哪一种坐标都无法获取鼠标右击的控件。
    2009年9月11日 9:15

全部回复

  • IEnumerable<UIElement> Myelements = VisualTreeHelper.FindElementsInHostCoordinates(new Rect(-10000, -10000, 10000, 10000), LinksStackPanel);
    LinkSubMe.Content = Myelements.Count().ToString();
    那就很奇怪,我这样搞,获取的数量是0,背景也刷了= =
    Silverlight现在很强大,以后还会更强大 如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”
    2009年9月11日 11:04
    版主