zoukankan      html  css  js  c++  java
  • Layout相关

    1. 获得一个控件相对于另一个控件的位置

    //Vector vector = VisualTreeHelper.GetOffset(relativeControl);

    //Canvas.SetLeft(this,vector.X);

    //Canvas.SetTop(this, vector.Y);

    //UIElement.TranslatePoint(new Point(0,0),parentWindow) //Translates a point relative to this element to coordinates that are relative to the specified element.

    2. Canvas 的 ClipToBounds="True" 属性, 这个属性比较有用,默认为false,这样会让在canvas显示范围外面的children也能显示出来,这样不太好。

    3.MeasureOverride(Size availableSize),  返回希望的size,主要在其中调用  element.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));获得disableSize. ArrangeOverride(Size finalSize) 第一次传入(0,0),第二次传入父节点给其的size.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Controls;
    using System.Windows;
    using System.Windows.Markup;
    using Pfs.Pam.GUI.Controls;

    namespace OverLayDemo
    {
        public class OverLayout : Canvas
        {

         
            protected override Size MeasureOverride(Size availableSize)
            {
                foreach (UIElement element in Children)
                {
                    element.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
                }

                if (availableSize.Equals(new Size(Double.PositiveInfinity, Double.PositiveInfinity)))
                {
                    return base.MeasureOverride(availableSize);
                }
                return availableSize;
            }

            protected override Size ArrangeOverride(Size finalSize)
            {
                if (finalSize.Equals(new Size(0, 0)))
                    return finalSize;
                Point leftTop = new Point(0, 0);
                Point leftBottom = new Point(0, finalSize.Height);
                Point leftMiddle = new Point(0, finalSize.Height / 2);
                Point middleTop = new Point(finalSize.Width / 2, 0);
                Point middleBottom = new Point(finalSize.Width / 2, finalSize.Height);
                Point rightTop = new Point(finalSize.Width, 0);
                Point rightMiddle = new Point(finalSize.Width, finalSize.Height / 2);
                Point rightBottom = new Point(finalSize.Width, finalSize.Height);


                foreach (UIElement element in Children)
                {
                    OverLayPanel panel = element as OverLayPanel;
                    if (panel == null) //|| panel .IsDrag == true
                        continue;

                    if (panel.SlideOutMode == Location.Left)
                    {
                        if (panel.VerticalPositionMode == VerticalAlignment.Top)
                            element.Arrange(new Rect(leftTop, element.DesiredSize));
                        else if (panel.VerticalPositionMode == VerticalAlignment.Middle)
                            element.Arrange(new Rect(new Point(0, leftMiddle.Y - element.DesiredSize.Height / 2), element.DesiredSize));
                        else if (panel.VerticalPositionMode == VerticalAlignment.Bottom)
                            element.Arrange(new Rect(new Point(0, leftBottom.Y - element.DesiredSize.Height), element.DesiredSize));
                        else
                            element.Arrange(new Rect(leftTop, finalSize));

                    }
                    else if (panel.SlideOutMode == Location.Rigth)
                    {
                        if (panel.VerticalPositionMode == VerticalAlignment.Top)
                            element.Arrange(new Rect(new Point(rightTop.X - element.DesiredSize.Width, 0), element.DesiredSize));
                        else if (panel.VerticalPositionMode == VerticalAlignment.Middle)
                            element.Arrange(new Rect(new Point(rightMiddle.X - element.DesiredSize.Width, rightMiddle.Y - element.DesiredSize.Height / 2), element.DesiredSize));
                        else if (panel.VerticalPositionMode == VerticalAlignment.Bottom)
                            element.Arrange(new Rect(new Point(rightBottom.X - element.DesiredSize.Width, rightBottom.Y - element.DesiredSize.Height), element.DesiredSize));
                        else
                            element.Arrange(new Rect(leftTop, finalSize));
                    }
                    else if (panel.SlideOutMode == Location.Top)
                    {
                        if (panel.HorizontalPositionMode == HorizontalAlignment.Left)
                            element.Arrange(new Rect(leftTop, element.DesiredSize));
                        else if (panel.HorizontalPositionMode == HorizontalAlignment.Center)
                            element.Arrange(new Rect(new Point(middleTop.X - element.DesiredSize.Width / 2, 0), element.DesiredSize));
                        else if (panel.HorizontalPositionMode == HorizontalAlignment.Right)
                            element.Arrange(new Rect(new Point(rightTop.X - element.DesiredSize.Width, 0), element.DesiredSize));
                        else
                            element.Arrange(new Rect(leftTop, finalSize));
                    }
                    else if (panel.SlideOutMode == Location.Bottom)
                    {
                        if (panel.HorizontalPositionMode == HorizontalAlignment.Left)
                            element.Arrange(new Rect(new Point(0, leftBottom.Y - element.DesiredSize.Height), element.DesiredSize));
                        else if (panel.HorizontalPositionMode == HorizontalAlignment.Center)
                        {
                            element.Arrange(new Rect(new Point(middleBottom.X - element.DesiredSize.Width / 2, middleBottom.Y - element.DesiredSize.Height), element.DesiredSize));
                        }
                        else if (panel.HorizontalPositionMode == HorizontalAlignment.Right)
                            element.Arrange(new Rect(new Point(rightBottom.X - element.DesiredSize.Width, rightBottom.Y - element.DesiredSize.Height), element.DesiredSize));
                        else
                            element.Arrange(new Rect(leftTop, finalSize));
                    }
                }


                return finalSize;
            }

        }
    }

    改ControlTemplate:

    <ControlTemplate>

    <Rectangle RadiusX="15" RadiusY="15" Margin="4,4,4,4"  SnapsToDevicePixels="True" Fill="LightBlue"/>

     <ContentPresenter x:Name="OverlayPanelContent" DockPanel.Dock="Top" />

    </ControlTemplate>


  • 相关阅读:
    WKWebView-b
    Label设置行间距
    前端开发福音!阿里Weex跨平台移动开发工具开源-b
    iOS 实现脉冲雷达以及动态增减元素 By Swift-感谢分享
    使用SourceTree将bitbucket的远程仓库回滚到某一次提交-b
    IPv6测试环境搭建
    React/React Native 的ES5 ES6写法对照表-b
    越狱开发:用iosOpenDev配置越狱开发环境 编写第一个hello world-b
    MSSQL-SQL SERVER还原与备份(导入与导出)
    PHP-深入学习Smarty
  • 原文地址:https://www.cnblogs.com/liangouyang/p/1362550.html
Copyright © 2011-2022 走看看