AY 一个wpf画图项目复习下【2/10】

栏目: 编程工具 · 发布时间: 5年前

内容简介:新建空白wpf项目,不会,参考上篇文章。知识点1:获得子元素相对于父元素位置和 宽高后台

新建空白wpf项目,不会,参考上篇文章。

知识点1:获得子元素相对于父元素位置和 宽高

  <Canvas x:Name="cv">
        <Rectangle x:Name="rct" Width="100" Height="80" Fill="#FFD62525" Canvas.Left="309" Canvas.Top="181" />
    </Canvas>

后台

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            Rect itemRect = VisualTreeHelper.GetDescendantBounds(rct);
            Rect itemBounds = rct.TransformToAncestor(cv).TransformBounds(itemRect);
            Console.WriteLine(itemRect);
            Console.WriteLine(itemBounds);
        }

效果:

itemRect是0,0,100,80

AY 一个wpf画图项目复习下【2/10】

我们把canvas换成grid试试

    <Grid x:Name="cv">
        <Rectangle x:Name="rct" Width="100" Height="80" Fill="#FFD62525" Margin="173,260,919,429"  />
    </Grid>

AY 一个wpf画图项目复习下【2/10】

如果子元素在滚动条范围内呢

修改前台

    <ScrollViewer Width="600" Height="400" x:Name="sv">
        <Grid x:Name="cv" Height="800">
            <Rectangle x:Name="rct" Width="100" Height="80" Fill="#FFD62525"  HorizontalAlignment="Left" VerticalAlignment="Top" Margin="300,500,0,0"/>
        </Grid>
    </ScrollViewer>

AY 一个wpf画图项目复习下【2/10】

后台的itemBounds和itemBoundsRelativeScrollViewer是一样的。

我们设置下grid的margin

AY 一个wpf画图项目复习下【2/10】

此时运行效果

AY 一个wpf画图项目复习下【2/10】AY 一个wpf画图项目复习下【2/10】

相对于滚动条的,加上了Grid的Margin的位置

我们理解了怎么求算子元素相对于某个元素的位置,就好办了。

知识点2:矩形区域计算,是否包含。

AY 一个wpf画图项目复习下【2/10】

我们可以通过Rect提供的方法。添加rct2,此时相交的。

AY 一个wpf画图项目复习下【2/10】

 Rect itemRect = VisualTreeHelper.GetDescendantBounds(rct);
            Rect itemBounds = rct.TransformToAncestor(cv).TransformBounds(itemRect);
            //Rect itemBoundsRelativeScrollViewer = rct.TransformToAncestor(sv).TransformBounds(itemRect);
            Console.WriteLine(itemRect);
            Console.WriteLine(itemBounds);
            //Console.WriteLine(itemBoundsRelativeScrollViewer);

            Rect itemRect2 = VisualTreeHelper.GetDescendantBounds(rct2);
            Rect itemBounds2 = rct2.TransformToAncestor(cv).TransformBounds(itemRect2);

            var _isIntersects = itemBounds.IntersectsWith(itemBounds2);
            var _isContains = itemBounds.Contains(itemBounds2);
            Console.WriteLine("_isIntersects="+ _isIntersects+ ",_isContains="+ _isContains);

AY 一个wpf画图项目复习下【2/10】

修改前台

AY 一个wpf画图项目复习下【2/10】

后台不变,输出

AY 一个wpf画图项目复习下【2/10】

所以根据这个,我们能实现 矩形选择框, 命中元素了。 我们把这种选区,英文名单词叫 Rubberband

知识点3,计算自己的中点坐标,然后相对于父元素的坐标。也可以理解相对于父元素的自己的中间坐标

比如一哥 宽11,高7的矩形,中点坐标,是 7,4但是外面如果有个 父元素,那么此时的坐标是多少呢?这就是解决问题的代码,如下

        public static Point GetCenterPoint(this FrameworkElement uiElement, UIElement parent)
        {
           return uiElement.TransformToAncestor(parent).Transform(new Point(uiElement.Width / 2, uiElement.Height / 2));
        }

效果:

我们能求出红色矩形的中心坐标,那么怎么求相对于父容器左上角的坐标呢?

用法如下:

AY 一个wpf画图项目复习下【2/10】

AY 一个wpf画图项目复习下【2/10】

当然这个距离,自己也可以算,矩形的一半+矩形距离左侧的矩形,上面同理,两个和的形成的坐标就是。

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

推荐您阅读更多有关于“WPF4.5,”的文章


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++语言的设计和演化

C++语言的设计和演化

[美] Bjarne Stroustrup / 裘宗燕 / 机械工业出版社 / 2002-1 / 48.00元

这本书是C++的设计者关于C++语言的最主要著作之一。作者综合性地论述了C++的历史和发展,C++中各种重要机制的本质意义和设计背景,这些机制的基本用途和使用方法,讨论了C++所适合的应用领域及其未来的发展前景。一起来看看 《C++语言的设计和演化》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具