zoukankan      html  css  js  c++  java
  • WP7备注(28)(自适应的Panel自定义UniformStack)

    public class UniformStack : Panel
    {
    public static readonly DependencyProperty OrientationProperty =
    DependencyProperty.Register("Orientation",
    typeof(Orientation),
    typeof(UniformStack),
    new PropertyMetadata(Orientation.Vertical, OnOrientationChanged));
    public Orientation Orientation
    {
    set { SetValue(OrientationProperty, value); }
    get { return (Orientation)GetValue(OrientationProperty); }
    }
    static void OnOrientationChanged(DependencyObject obj,
    DependencyPropertyChangedEventArgs args)
    {
    (obj as UniformStack).InvalidateMeasure();
    }
    …
    }

    InvalidateMeasure方法的调用使控件重新测量和安排元素的位置

    MeasureOverride()重写测量方法

    protected override Size MeasureOverride(Size availableSize)
    {
    if (Children.Count == 0)
    return new Size();
    Size availableChildSize = new Size();
    Size maxChildSize = new Size();
    Size compositeSize = new Size();
    // Calculate an available size for each child
    if (Orientation == Orientation.Horizontal)
    availableChildSize = new Size(availableSize.Width / Children.Count,
    availableSize.Height);
    else
    availableChildSize = new Size(availableSize.Width,
    availableSize.Height / Children.Count);
    // Enumerate the children, and find the widest width and the highest height
    foreach (UIElement child in Children)
    {
    child.Measure(availableChildSize);
    maxChildSize.Width = Math.Max(maxChildSize.Width, child.DesiredSize.Width);
    maxChildSize.Height = Math.Max(maxChildSize.Height,
    child.DesiredSize.Height);
    }
    // Now determine a composite size that depends on infinite available width or
    height
    if (Orientation == Orientation.Horizontal)
    {
    if (Double.IsPositiveInfinity(availableSize.Width))
    compositeSize = new Size(maxChildSize.Width * Children.Count,
    maxChildSize.Height);
    else
    compositeSize = new Size(availableSize.Width, maxChildSize.Height);
    }
    else
    {
    if (Double.IsPositiveInfinity(availableSize.Height))
    compositeSize = new Size(maxChildSize.Width,
    maxChildSize.Height * Children.Count);
    else
    compositeSize = new Size(maxChildSize.Width, availableSize.Height);
    }
    return compositeSize;
    }

    重写ArrangeOverride重新安排控件位置

    protected override Size ArrangeOverride(Size finalSize)
    {
    if (Children.Count > 0)
    {
    Size finalChildSize = new Size();
    double x = 0;
    double y = 0;
    if (Orientation == Orientation.Horizontal)
    finalChildSize = new Size(finalSize.Width / Children.Count,
    finalSize.Height);
    else
    finalChildSize = new Size(finalSize.Width,
    finalSize.Height / Children.Count);
    foreach (UIElement child in Children)
    {
    child.Arrange(new Rect(new Point(x, y), finalChildSize));
    if (Orientation == Orientation.Horizontal)
    x += finalChildSize.Width;
    else
    y += finalChildSize.Height;
    }
    }
    return base.ArrangeOverride(finalSize);
    }
  • 相关阅读:
    gitlab 建仓的流程
    gitlab安装
    以普通用户登录 su root 用vncviewer:xxxxx 会报错!!exit 回到最初环境变的用户 问题解决!!!!
    linux下绘图工具dia
    rds材资收集
    export 解决环境变量的问题!!!!
    查看nginx版本号
    grep -C n "匹配字符串" 匹配字符串上下N行
    查看TOMCAT的版本
    导出数据库的结构不含数据
  • 原文地址:https://www.cnblogs.com/otomii/p/2034454.html
Copyright © 2011-2022 走看看