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