如何自定义XamlCompositionBrushBase实现图片平铺
admin
2023-02-15 02:20:05
0

这篇文章运用简单易懂的例子给大家介绍自定义XamlCompositionBrushBase实现图片平铺的方法,文章内容步步紧凑,希望大家根据这篇文章可以有所收获。

1. 背景

我早就想试试自定义XamlCompositionBrushBase,但一直没机会。上一篇文章介绍到使用Win2D的BorderEffect实现图片的平铺功能,原理很简单,但每次都要写这些代码很繁琐,正好就用这个作为例子试试XamlCompositionBrushBase。

CompositionBrush灵活多变,它的基本用法如下:

  1. 通过Compositor创建CompositionBrush;
  2. 配置CompositionBrush;
  3. 创建SpriteVisual并将它的Brush设置为CompositionBrush;
  4. 使用ElementCompositionPreview.SetElementChildVisual 将SpriteVisual设置到某个UIElement的可视化层里。

这些步骤很繁琐,而且不能用在XAML中。XamlCompositionBrushBase提供了将CompositionBrush用在XAML中一个桥梁,他继承自Brush类,可以直接像普通的XAML 画笔(如SolidColorBrush)那样直接用在XAML中。

Windows Community Toolkit中已经提了很不少XamlCompositionBrushBase的实现,它们的使用方式已经有很多文章介绍,这里不一一列举。

2. 自定义XamlCompositionBrushBase

这篇文章将介绍一个自定义的画笔:TiledImageBrush,它的主要目标是实现ImageBrush没有的图片平铺功能,并且它可以在XAML中使用,使用方式如下:


    
        
    

顺便复习下普通的ImageBrush的用法:


    
        
    

看起来TiledImageBrush的用法是不是和ImageBrush很像?接下来讲解TiledImageBrush的实现步骤。TiledImageBrush继承自XamlCompositionBrushBase,而实现XamlCompositionBrushBase的一般步骤如下:

protected override void OnConnected()
{
    // Delay creating composition resources until they're required.
    if (CompositionBrush == null)
    {
         CompositionBrush = CreateCompositionBrush();//Create A CompositionBrush.
    }
}

protected override void OnDisconnected()
{
    // Dispose of composition resources when no longer in use.
    if (CompositionBrush != null)
    {
        CompositionBrush.Dispose();
        CompositionBrush = null;
    }
}

首先重写OnConnected,当画笔在屏幕上首次用于绘制元素时会调用这个函数。在这个函数里创建CompositionBrush并赋值给XamlCompositionBrushBase.CompositionBrush。

然后重写OnDisconnected,它在画笔不再用于绘制任何元素时被调用。在这个函数里尽可能地释放各种资源,例如CompositionBrush。这两步就是实现XamlCompositionBrushBase的基本步骤。

创建CompositionBrush有很多种玩法,我之前写过两篇文章分别介绍 CompositionBrush入门及 在CompositionBrush上使用Effect。这里使用使用Win2D的BorderEffect实现图片的平铺功能这篇文章里介绍到的代码,首先使用LoadedImageSurface.StartLoadFromUri创建CompositionSurfaceBrush,然后加入到BorderEffect里实现图片平铺,然后把产生的CompositionEffectBrush赋值给XamlCompositionBrushBase.CompositionBrush

TiledImageBrush中添加了Source属性用于设置图片Uri(实际上是个ImageSource类型),模仿ImageBrush,这里的Source也是一个ImageSource类型的属性,虽然实际上使用的是它的UriSource。详细代码如下:

public ImageSource Source
{
    get => (ImageSource)GetValue(SourceProperty);
    set => SetValue(SourceProperty, value);
}

private void UpdateSurface()
{
    if (Source != null && _surfaceBrush != null)
    {
        var uri = (Source as BitmapImage)?.UriSource ?? new Uri("ms-appx:///");
        _surface = LoadedImageSurface.StartLoadFromUri(uri);
        _surfaceBrush.Surface = _surface;
    }
}

OnConnected的详细代码如下:

protected override void OnConnected()
{
    base.OnConnected();

    if (CompositionBrush == null)
    {
        _surfaceBrush = Compositor.CreateSurfaceBrush();
        _surfaceBrush.Stretch = CompositionStretch.None;

        UpdateSurface();

        _borderEffect = new BorderEffect()
        {
            Source = new CompositionEffectSourceParameter("source"),
            ExtendX = Microsoft.Graphics.Canvas.CanvasEdgeBehavior.Wrap,
            ExtendY = Microsoft.Graphics.Canvas.CanvasEdgeBehavior.Wrap
        };

        _borderEffectFactory = Compositor.CreateEffectFactory(_borderEffect);
        _borderEffectBrush = _borderEffectFactory.CreateBrush();
        _borderEffectBrush.SetSourceParameter("source", _surfaceBrush);
        CompositionBrush = _borderEffectBrush;
    }
}

上文描述的就是自定义XamlCompositionBrushBase实现图片平铺的方法,具体使用情况还需要大家自己动手实验使用过才能领会。如果想了解更多相关内容,欢迎关注行业资讯频道!

相关内容

热门资讯

终于明白“炫龙牛牛是不是有挂?... 有 亲,根据资深记者爆料炫龙牛牛是可以开挂的,确实有挂(咨询软件无需打开...
我来教教您“乐乐围棋入门开挂器... 网上科普关于“乐乐围棋入门有没有挂”话题很是火热,小编也是针对乐乐围棋入门作*弊开挂的方法以及开挂对...
我来教教您“新九天炸/金/花开... 您好:新九天炸/金/花这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在...
终于懂了“边锋老友二打一有挂吗... 家人们!今天小编来为大家解答边锋老友二打一透视挂怎么安装这个问题咨询软件客服徽9752949的挂在哪...
【第一资讯】“普通扑克分析哪家... 网上科普关于“普通扑克分析哪家大小有没有挂”话题很是火热,小编也是针对普通扑克分析哪家大小作*弊开挂...
终于了解“同城跑胡子开挂器?”... 网上科普关于“同城跑胡子有没有挂”话题很是火热,小编也是针对同城跑胡子作*弊开挂的方法以及开挂对应的...
今日重磅消息“王子棋牌开挂器?... 家人们!今天小编来为大家解答王子棋牌透视挂怎么安装这个问题咨询软件客服徽9752949的挂在哪里买很...
今日重大发现“蛮王炸/金/花究... 今日重大发现“蛮王炸/金/花究竟有挂吗?”(确实真的有挂)您好,蛮王炸/金/花这个游戏其实有挂的,确...
今日重大通报“国民麻将到底是不... 家人们!今天小编来为大家解答国民麻将透视挂怎么安装这个问题咨询软件客服徽9784099的挂在哪里买很...
终于明白“新众亿牌九到底有挂吗... 有 亲,根据资深记者爆料新众亿牌九是可以开挂的,确实有挂(咨询软件无需打...