Конвертировать WPF элемент управления в Silverlight - PullRequest
0 голосов
/ 12 октября 2011

Существует очень старое WPF-приложение Hyper Tree - http://blogs.msdn.com/b/llobo/archive/2007/10/31/mindmap-app-using-hyperbolic-tree.aspx.

Исходный код можно найти на codeplax.com - http://hypertree.codeplex.com/releases/view/11524

Я хотел использовать этот элемент управления деревом в своем приложении Silverlight. Теперь проблема в том, что я новичок в Silverlight, а код использует некоторые специфические для WPF вещи.

Пожалуйста, предложите мне решить мою проблему.

Заранее спасибо.

Abhinav

Обновление:

такие вещи, как FrameworkPropertyMetadata и FrameworkPropertyMetadataOptions, InvalidateVisual(), OnRender переопределить, дочерний UIElements.

Код добавлен:

public class SmartBorder : Decorator
{
    #region Dependency Properties
    public static readonly DependencyProperty GlowBrushProperty =
        DependencyProperty.Register("GlowBrush", typeof(Brush), typeof(SmartBorder), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));

  ......

    #region Dependency Property backing CLR properties
......
    #endregion

    // if the button is pressed, this fires
    private static void OnRenderIsPressedChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        SmartBorder border = o as SmartBorder;
        if (border != null)
        {
            if ((bool)e.NewValue == true)
            {
                border.BorderBrush = Brushes.Transparent;
                border.BorderWidth = 2;
            }
            else
            {
                border.BorderBrush = Brushes.Red;
                border.BorderWidth = 2;

            }
            border.InvalidateVisual();
        }
    }

    // if the mouse is over the control, this fires
    private static void OnRenderIsMouseOverChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        SmartBorder border = o as SmartBorder;
        if (border != null)
        {
            border.InvalidateVisual();
        }

    }

    // a series of methods which all make getting the default or currently selected brush easier


    protected override void OnRender(DrawingContext dc)
    {
        Rect rc = new Rect(0, 0, this.ActualWidth, this.ActualHeight);

        LinearGradientBrush gradientOverlay = GetGradientOverlay();
        Brush glowBrush = GetGlowBrush();
        Brush backBrush = GetBackgroundBrush();
        Brush borderBrush = GetBorderBrush();
        Pen borderPen = new Pen(borderBrush, BorderWidth);
        double cornerRadiusCache = CornerRadius;

        // draw the highlight as necessary
        if (RenderIsMouseOver)
        {
            Rect rcGlow = rc;
            double glowMove = BorderWidth * 2;
            rcGlow.Inflate(glowMove, glowMove);
            glowMove = 0;
            rcGlow.Offset(new Vector(glowMove, glowMove));
            dc.DrawRoundedRectangle(GetOuterGlowBrush(), null, rcGlow, cornerRadiusCache, cornerRadiusCache);
        }

        // we want to clip anything that might errantly draw outside of the smart border control
        dc.PushClip(new RectangleGeometry(rc, cornerRadiusCache, cornerRadiusCache));

        dc.DrawRoundedRectangle(backBrush, borderPen, rc, cornerRadiusCache, cornerRadiusCache);
        dc.DrawRoundedRectangle(gradientOverlay, borderPen, rc, cornerRadiusCache, cornerRadiusCache);

        if (!RenderIsPressed)
        {
            double clipBorderSize = BorderWidth * -4.0;
            Rect rcClip = rc;
            rcClip.Offset(clipBorderSize, clipBorderSize);
            rcClip.Inflate(-clipBorderSize, -clipBorderSize);
            dc.PushClip(new RectangleGeometry(rcClip, cornerRadiusCache, cornerRadiusCache));
            dc.DrawEllipse(glowBrush, null, new Point(this.ActualWidth / 2, this.ActualHeight * 0.10), this.ActualWidth * 0.80, this.ActualHeight * 0.40);
            dc.Pop();
        }
        // just draw the border now to make sure it overlaps everything nicely
        dc.DrawRoundedRectangle(null, borderPen, rc, cornerRadiusCache, cornerRadiusCache);

        dc.Pop();
        //base.OnRender(drawingContext);
    }


    protected override Size MeasureOverride(Size constraint)
    {
        UIElement child = this.Child as UIElement;

        double borderThickness = BorderWidth * 2.0;

        if (child != null)
        {

    ...
        }

        return new Size(Math.Min(borderThickness, constraint.Width), Math.Min(borderThickness, constraint.Height));
    }
}

1 Ответ

1 голос
/ 17 июня 2012

Относительно FrameworkPropertyMetadata и FrameworkPropertyMetadataOptions и приведения значений и т. Д. Для Silverlight см. Решение WPF_Compatibility в базе кодов ClipFlair (http://clipflair.codeplex.com)

...