我正在尝试自定义WPF中复选框的外观。我希望我可以获取PresentationFramework.Aero中定义的BulletChrome类的默认控件模板并使用它。但是,BulletChrome不是Control的子控件,因此没有要修改的模板。有人知道我可以这样做吗?

最佳答案

如果要将某种BulletChrome放置在CheckBox模板中经典模板中BulletDecorator所在的位置,则可以这样做,因为BulletChrome继承自Decorator,而FrameworkElement则继承自OnRender()

下一部分,BulletChrome外观如何?好吧,这是WPF中罕见的部分,它们无需xaml就可以完全处理渲染:ButtonChrome的视觉外观是在其方法中定义的。

BulletChrome.OnRender(),来自Reflector:

protected override void OnRender(DrawingContext drawingContext)
{
    Rect bounds = new Rect(0.0, 0.0, base.ActualWidth, base.ActualHeight);
    this.DrawBackground(drawingContext, ref bounds);
    this.DrawDropShadows(drawingContext, ref bounds);
    this.DrawBorder(drawingContext, ref bounds);
    this.DrawInnerBorder(drawingContext, ref bounds);
}


不幸的是,由于在OnRender()内部调用的所有这些方法都是私有的,因此即使您将ButtonChrome子类化,也无法将它们弄乱,也许只是将您的某些渲染覆盖在顶部。

因此,基本上,您要么开始研究Reflector中的渲染代码,然后尝试调整并重写它以适应您的需求,要么从头开始滚动自己的Template / Decorator /。 (但是,只要能使用,那么使用它实际上并不重要,对吧?)

希望这能回答您的问题,欢呼。

关于c# - 在WPF中自定义BulletChrome元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1148276/

10-12 03:10