在Silverlight中转换WPF控件

在Silverlight中转换WPF控件,wpf,silverlight,treeview,Wpf,Silverlight,Treeview,有一个非常古老的超树WPF应用程序- 源代码可在codeplax.com上找到- 我想在silverlight应用程序中使用此树控件。现在的问题是,我是silverlight的新手,代码使用了一些特定于WPF的东西 请建议我解决我的问题 提前谢谢 阿比纳夫 更新: 诸如此类 FrameworkPropertyMetadata和FrameworkPropertyMetadata选项,InvalidateVisual(),OnRender覆盖,子UIElements 新增代码: public cl

有一个非常古老的超树WPF应用程序-

源代码可在codeplax.com上找到-

我想在silverlight应用程序中使用此树控件。现在的问题是,我是silverlight的新手,代码使用了一些特定于WPF的东西

请建议我解决我的问题

提前谢谢

阿比纳夫

更新:

诸如此类
FrameworkPropertyMetadata
FrameworkPropertyMetadata选项
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));
    }
}

关于
FrameworkPropertyMetadata
FrameworkPropertyMetadata选项
和值强制等。有关Silverlight,请参阅ClipFlair代码库下的WPF_兼容性解决方案()

请详细说明“一些特定于WPF的事情”。)<代码>帮助你意思是解释这些东西是什么?…:-)。。。好吧,你得读一读,伙计。。。MSDN/Blogs/silverlight文章。。。我们可能会给你一些简明的定义,但它们会让你的生活更加艰难,因为它们可能会引用一些你可能不知道的术语。。。。顺便说一句,欢迎来到WPF/Silverlight这个充满挑战但精彩的世界……:)@谢谢你。但是我想知道silverlight中WPF类的替代品,以便我可以使用它。@ago.net,同样,我的答案不会改变。。。参考MSDN。。。您还可以看到我在上编写WPF_兼容性时收集的参考资料