wpf单容器中的Chrome

Chrome有点类似于用GDI+画图一般,除了模板,也可以使用DrawingContext对象来画图.

WPF内置的很多控件都是如此实现的,虽然麻烦了一些,可能是为了提升性能考虑.

其方式与定义样式模板差不多,只不过换成代码形式了.

1.先定义控件不同状态下的颜色,

private static SolidColorBrush CommonDisabledBackgroundOverlay {
    get {
        if (commonDisabledBackgroundOverlay == null) {
            lock (resourceAccess) {
                if (commonDisabledBackgroundOverlay == null) {
                    SolidColorBrush brush = new SolidColorBrush(Color.FromRgb(0xf4, 0xf4, 0xf4));
                    brush.Freeze();
                    commonDisabledBackgroundOverlay = brush;
                }
            }
        }
        return commonDisabledBackgroundOverlay;
    }
}


2.定义控件样式状态

private Brush BackgroundOverlay {
    get {
        if (!base.IsEnabled) {
            return CommonDisabledBackgroundOverlay;
        }
        if (!this.Animates) {
            if (this.RenderPressed) {
                return CommonPressedBackgroundOverlay;
            }
            if (this.RenderMouseOver) {
                return CommonHoverBackgroundOverlay;
            }
            return null;
        }
return null; } }

3.在OnRender方法中呈现样式

private void DrawBackground(DrawingContext dc, ref Rect bounds)
{
    if (base.IsEnabled || Corners.None != this.RoundCorners)
    {
        Brush background = this.Background;
        if (background == null) background = this.BackgroundOverlay;
        if ((bounds.Width > 4.0) && (bounds.Height > 4.0))
        {
            Rect rectangle = new Rect(bounds.Left + 1.0, bounds.Top + 1.0, bounds.Width - 2.0, bounds.Height - 2.0);
            if (background != null)
            {
                if (!this.RenderTransparentBackground || this.RenderDefaulted || this.RenderMouseOver || this.RenderPressed)
                    dc.DrawRectangle(background, null, rectangle);
                else
                    dc.DrawRectangle(Brushes.Transparent, null, rectangle);
            }
        }
    }
}

现在为止一个背景色就设置好了,从这里回头看Border容器,也是采用用样的做法,WPF内置的Shape也是如此.

之前感觉比较困惑,Shape的呈现可以理解,Button的呈现还无法理解.
内置的Button使用了ButtonChrome,CheckBox使用了BulletChrome.估计其他控件也是如此.所以所有的控件还是一样,都是一点一滴画出来的.

WPF使用IoC容器可以让代码更加灵活、可扩展和易于维护。常见的IoC容器有Autofac、Unity、StructureMap等。 下面以Autofac为例,介绍如何在WPF进行IoC容器注册。 1. 安装Autofac NuGet包 在Visual Studio打开NuGet包管理器控制台,执行以下命令: ``` Install-Package Autofac ``` 2. 创建一个IoC容器 在App.xaml.cs文件创建一个静态的Autofac容器: ```csharp public partial class App : Application { public static IContainer Container { get; private set; } protected override void OnStartup(StartupEventArgs e) { // 创建一个IoC容器 var builder = new ContainerBuilder(); // 注册依赖关系 builder.RegisterType<MyService>().As<IMyService>(); // 构建容器 Container = builder.Build(); base.OnStartup(e); } } ``` 在这个例子,我们注册了一个名为MyService的服务,并将其标记为IMyService接口的实现类型。 3. 在应用程序使用IoC容器 在需要使用服务的地方,我们可以使用容器解析服务的实例。 ```csharp public partial class MainWindow : Window { private readonly IMyService _myService; public MainWindow() { InitializeComponent(); // 通过IoC容器获取MyService的实例 _myService = App.Container.Resolve<IMyService>(); } } ``` 在这个例子,我们使用IoC容器解析MyService的实例,并将其保存在_myService字段。这样,在MainWindow类就可以使用_myService字段调用MyService的方法了。 通过这种方式,我们可以实现依赖注入,减少代码的耦合性,提高应用程序的可扩展性和易于维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值