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);
    }
  • 相关阅读:
    Java 语句总结
    存储过程 替换字符串
    解决MyEclipse吃内存以及卡死的方法
    Tomcat启动时自动加载一个类
    oracle sql日期比较:
    项目数据库操作
    Oracle 删除重复数据只留一条
    oracle ORA-00001:违反唯一约束条件
    Oracle ORA-12519: TNS:no appropriate service handler found 解决
    tomecat 配置修改 及启动配置
  • 原文地址:https://www.cnblogs.com/otomii/p/2034454.html
Copyright © 2011-2022 走看看