在Silverlight中转换WPF控件

时间:2011-10-12 06:58:27

标签: wpf silverlight treeview

Hyper Tree有一个非常古老的WPF应用程序 - 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特定的东西。

请建议我解决我的问题。

提前致谢。

阿比纳夫

更新

像这样的事情 FrameworkPropertyMetadataFrameworkPropertyMetadataOptionsInvalidateVisual()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 个答案:

答案 0 :(得分:1)

关于Silverlight的FrameworkPropertyMetadataFrameworkPropertyMetadataOptions以及值强制等,请参阅ClipFlair代码库(http://clipflair.codeplex.com)下的WPF_Compatibility解决方案