Aracılığıyla paylaş


Kompozisyon fırçaları

Bir WinUI uygulamasında ekranınızda görünen her şey, bir fırça tarafından boyandığı için görünür. Fırçalar, basit düz renklerden resimlere, çizimlere ve karmaşık efekt zincirlerine kadar çeşitli içeriklerle kullanıcı arabirimi (UI) nesnelerini boyamanızı sağlar. Bu konu, CompositionBrush ile boyama kavramlarını tanıtır.

WinUI XAML uygulamasıyla çalışırken XAML fırçası veya CompositionBrush ile UIElement boyamayı seçebilirsiniz. Senaryonuz zaten bir tane tarafından destekleniyorsa, genellikle XAML fırçası seçmek daha kolaydır. Örneğin, bir düğmenin renginin animasyonunu oluşturma veya metin veya şekil dolgusunun resimle değiştirilmesi. XAML fırça tarafından desteklenmeyen, animasyonlu maske, animasyonlu dokuz bölge esnetme veya efekt zinciri gibi bir duruma ihtiyacınız varsa, XamlCompositionBrushBase aracılığıyla bir UIElement boyamak için CompositionBrush kullanabilirsiniz.

Görsel katmanıyla çalışırken, SpriteVisual alanını boyamak için bir CompositionBrush kullanılmalıdır.

Önkoşullar

Bu genel bakış, Görsel katmanına genel bakış bölümünde açıklandığı gibi temel bir Oluşturma uygulamasının yapısı hakkında bilgi sahibi olduğunuzu varsayar.

CompositionBrush ile Boyama

CompositionBrush, çıktısını kullanarak bir alanı "boyar". Farklı fırçaların farklı çıkış türleri vardır. Bazı fırçalar düz renkle bir alanı, diğerleri gradyan, resim, özel çizim veya efektle boyar. Diğer fırçaların davranışını değiştiren özelleştirilmiş fırçalar da vardır. Örneğin, opaklık maskesi bir CompositionBrush tarafından hangi alanın boyanacağını denetlemek için kullanılabilir veya bir alanı boyarken CompositionBrush'a uygulanan esnetmeyi denetlemek için dokuz kılavuzlu bir kılavuz kullanılabilir. CompositionBrush aşağıdaki türlerden biri olabilir:

Sınıf Ayrıntılar
CompositionColorBrush Bir alanı düz bir renkle boyar
CompositionSurfaceBrush Bir alanı ICompositionSurface içeriğiyle boyar
CompositionEffectBrush Bir alanı bir kompozisyon efektinin içeriğiyle boyar
CompositionMaskBrush CompositionBrush kullanarak opaklık maskesiyle bir görseli boyar
CompositionNineGridBrush Bir alanı CompositionBrush ile NineGrid esnetme kullanarak boyar.
CompositionLinearGradientBrush Doğrusal gradyan ile bir alanı boyar
CompositionRadialGradientBrush Radyal gradyan ile bir alanı boyar
CompositionBackdropBrush Uygulamadan veya masaüstündeki uygulamanın penceresinin hemen arkasındaki piksellerden arka plan piksellerini örnekleyerek bir alanı boyar. CompositionEffectBrush gibi başka bir CompositionBrush'a giriş olarak kullanılır

Düz bir renkle boyayın

CompositionColorBrush, bir alanı düz bir renkle boyar. SolidColorBrush'ın rengini belirtmenin çeşitli yolları vardır. Örneğin, alfa, kırmızı, mavi ve yeşil (ARGB) kanallarını belirtebilir veya Colors sınıfı tarafından sağlanan önceden tanımlanmış renklerden birini kullanabilirsiniz.

Aşağıdaki çizimde ve kodda, siyah renk fırçasıyla konturlanmış ve 0x9ACD32 renk değerine sahip düz bir renk fırçasıyla boyanmış bir dikdörtgen oluşturmak için küçük bir görsel ağaç gösterilmektedir.

CompositionColorBrush

Compositor _compositor;
ContainerVisual _container;
SpriteVisual _colorVisual1, _colorVisual2;
CompositionColorBrush _blackBrush, _greenBrush;

_compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;
_container = _compositor.CreateContainerVisual();

_blackBrush = _compositor.CreateColorBrush(Colors.Black);
_colorVisual1 = _compositor.CreateSpriteVisual();
_colorVisual1.Brush = _blackBrush;
_colorVisual1.Size = new Vector2(156, 156);
_colorVisual1.Offset = new Vector3(0, 0, 0);
_container.Children.InsertAtBottom(_colorVisual1);

_greenBrush = _compositor.CreateColorBrush(Color.FromArgb(0xff, 0x9A, 0xCD, 0x32));
_colorVisual2 = _compositor.CreateSpriteVisual();
_colorVisual2.Brush = _greenBrush;
_colorVisual2.Size = new Vector2(150, 150);
_colorVisual2.Offset = new Vector3(3, 3, 0);
_container.Children.InsertAtBottom(_colorVisual2);

Doğrusal gradyan ile boyama

CompositionLinearGradientBrush bir alanı doğrusal gradyanla boyar. Doğrusal gradyan, gradyan ekseni olmak üzere iki veya daha fazla rengi bir çizgi boyunca harmanlar. Gradyandaki renkleri ve bunların konumlarını belirtmek için GradientStop nesnelerini kullanırsınız.

Aşağıdaki çizimde ve kodda, kırmızı ve sarı renk kullanılarak 2 duraklı LinearGradientBrush ile boyanmış bir SpriteVisual gösterilmektedir.

CompositionLinearGradientBrush

Compositor _compositor;
SpriteVisual _gradientVisual;
CompositionLinearGradientBrush _redyellowBrush;

_compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

_redyellowBrush = _compositor.CreateLinearGradientBrush();
_redyellowBrush.ColorStops.Add(_compositor.CreateColorGradientStop(0, Colors.Red));
_redyellowBrush.ColorStops.Add(_compositor.CreateColorGradientStop(1, Colors.Yellow));
_gradientVisual = _compositor.CreateSpriteVisual();
_gradientVisual.Brush = _redyellowBrush;
_gradientVisual.Size = new Vector2(156, 156);

Radyal gradyan ile boyama

CompositionRadialGradientBrush bir alanı radyal gradyan ile boyar. Radyal gradyan, elipsin merkezinden başlayıp elipsin yarıçapında biten gradyan ile iki veya daha fazla rengi harmanlar. GradyanStop nesneleri, renkleri ve gradyandaki konumlarını tanımlamak için kullanılır.

Aşağıdaki çizimde ve kodda 2 GradyanStoplu RadialGradientBrush ile boyanmış bir SpriteVisual gösterilmektedir.

CompositionRadialGradientFırçası

Compositor _compositor;
SpriteVisual _gradientVisual;
CompositionRadialGradientBrush RGBrush;

_compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

RGBrush = _compositor.CreateRadialGradientBrush();
RGBrush.ColorStops.Add(_compositor.CreateColorGradientStop(0, Colors.Aquamarine));
RGBrush.ColorStops.Add(_compositor.CreateColorGradientStop(1, Colors.DeepPink));
_gradientVisual = _compositor.CreateSpriteVisual();
_gradientVisual.Brush = RGBrush;
_gradientVisual.Size = new Vector2(200, 200);

Bir resimle boyama

CompositionSurfaceBrush, piksellerin işlendiği bir alanı ICompositionSurface üzerine boyar. Örneğin, CompositionSurfaceBrush, LoadedImageSurface API'sini kullanarak ICompositionSurface üzerine işlenmiş bir görüntüyle bir alanı boyamak için kullanılabilir.

Aşağıdaki çizimde ve kodda, LoadedImageSurface kullanılarak bir ICompositionSurface üzerinde işlenen meyan kökü bit eşlemi ile boyanmış bir SpriteVisual gösterilmektedir. CompositionSurfaceBrush'ın özellikleri, bit eşlemi görselin sınırları içinde genişletmek ve hizalamak için kullanılabilir.

CompositionSurfaceBrush

Compositor _compositor;
SpriteVisual _imageVisual;
CompositionSurfaceBrush _imageBrush;

_compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

_imageBrush = _compositor.CreateSurfaceBrush();

// The loadedSurface has a size of 0x0 till the image has been downloaded, decoded and loaded to the surface. We can assign the surface to the CompositionSurfaceBrush and it will show up once the image is loaded to the surface.
LoadedImageSurface _loadedSurface = LoadedImageSurface.StartLoadFromUri(new Uri("ms-appx:///Assets/licorice.jpg"));
_imageBrush.Surface = _loadedSurface;

_imageVisual = _compositor.CreateSpriteVisual();
_imageVisual.Brush = _imageBrush;
_imageVisual.Size = new Vector2(156, 156);

Kendi çiziminizle boyayın

CompositionSurfaceBrush, Win2D (veya D2D) kullanılarak işlenen bir ICompositionSurface'den piksel içeren bir alanı boyamak için de kullanılabilir.

Aşağıdaki kod, Win2D kullanılarak ICompositionSurface üzerinde işlenen bir metin çalışmasıyla boyanmış bir SpriteVisual'ı gösterir. Win2D'yi WinUI ile kullanmak için projenize Microsoft.Graphics.Win2D NuGet paketini yükleyin.

Compositor _compositor;
CanvasDevice _device;
CompositionGraphicsDevice _compositionGraphicsDevice;
SpriteVisual _drawingVisual;
CompositionSurfaceBrush _drawingBrush;

_compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;
_device = CanvasDevice.GetSharedDevice();
_compositionGraphicsDevice = CanvasComposition.CreateCompositionGraphicsDevice(_compositor, _device);

_drawingBrush = _compositor.CreateSurfaceBrush();
CompositionDrawingSurface _drawingSurface = _compositionGraphicsDevice.CreateDrawingSurface(
    new Size(256, 256),
    DirectXPixelFormat.B8G8R8A8UIntNormalized,
    DirectXAlphaMode.Premultiplied);

using (var ds = CanvasComposition.CreateDrawingSession(_drawingSurface))
{
    ds.Clear(Colors.Transparent);
    var rect = new Rect(new Point(2, 2), (_drawingSurface.Size.ToVector2() - new Vector2(4, 4)).ToSize());
    ds.FillRoundedRectangle(rect, 15, 15, Colors.LightBlue);
    ds.DrawRoundedRectangle(rect, 15, 15, Colors.Gray, 2);
    ds.DrawText("This is a composition drawing surface", rect, Colors.Black, new CanvasTextFormat()
    {
        FontFamily = "Comic Sans MS",
        FontSize = 32,
        WordWrapping = CanvasWordWrapping.WholeWord,
        VerticalAlignment = CanvasVerticalAlignment.Center,
        HorizontalAlignment = CanvasHorizontalAlignment.Center
    });
}

_drawingBrush.Surface = _drawingSurface;

_drawingVisual = _compositor.CreateSpriteVisual();
_drawingVisual.Brush = _drawingBrush;
_drawingVisual.Size = new Vector2(156, 156);

Benzer şekilde, CompositionSurfaceBrush, Win2D uyumluluğu kullanılarak SwapChain ile bir SpriteVisual'ı boyamak için de kullanılabilir. Bu örnek, Win2D kullanarak bir SpriteVisual'ı bir swapchain ile boyama yöntemini gösterir.

Video ile boyama

CompositionSurfaceBrush, MediaPlayer sınıfı aracılığıyla yüklenen bir video kullanılarak işlenen bir ICompositionSurface'den piksel içeren bir alanı boyamak için de kullanılabilir.

Aşağıdaki kod, ICompositionSurface üzerine yüklenmiş bir video ile boyanmış bir SpriteVisual gösterir.

Compositor _compositor;
SpriteVisual _videoVisual;
CompositionSurfaceBrush _videoBrush;

_compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

// MediaPlayer setup with a source URI.
_mediaPlayer = new MediaPlayer();

// Get a source from a URI. This could also come from a file or a stream.
var source = MediaSource.CreateFromUri(new Uri("https://go.microsoft.com/fwlink/?LinkID=809007&clcid=0x409"));
var item = new MediaPlaybackItem(source);
_mediaPlayer.Source = item;
_mediaPlayer.IsLoopingEnabled = true;

// Get the surface from MediaPlayer and put it on a brush.
_videoSurface = _mediaPlayer.GetSurface(_compositor);
_videoBrush = _compositor.CreateSurfaceBrush(_videoSurface.CompositionSurface);

_videoVisual = _compositor.CreateSpriteVisual();
_videoVisual.Brush = _videoBrush;
_videoVisual.Size = new Vector2(156, 156);

Filtre efektiyle boyama

CompositionEffectBrush, bir CompositionEffect çıktısını kullanarak bir alanı boyar. Görsel Katmanı'ndaki efektler, renkler, gradyanlar, görüntüler, videolar, takas zincirleri, kullanıcı arabiriminizin bölgeleri veya Görsel ağaçları gibi kaynak içerik koleksiyonuna uygulanan animasyonlanabilir filtre efektleri olarak düşünülebilir. Kaynak içerik genellikle başka bir CompositionBrush kullanılarak belirtilir.

Aşağıdaki çizimde ve kodda doyma filtresi efekti uygulanmış bir kedinin görüntüsüyle boyanmış bir SpriteVisual gösterilmektedir.

CompositionEffectBrush

Compositor _compositor;
SpriteVisual _effectVisual;
CompositionEffectBrush _effectBrush;

_compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

var graphicsEffect = new SaturationEffect
{
    Saturation = 0.0f,
    Source = new CompositionEffectSourceParameter("mySource")
};

var effectFactory = _compositor.CreateEffectFactory(graphicsEffect);
_effectBrush = effectFactory.CreateBrush();

CompositionSurfaceBrush surfaceBrush = _compositor.CreateSurfaceBrush();
LoadedImageSurface loadedSurface = LoadedImageSurface.StartLoadFromUri(new Uri("ms-appx:///Assets/cat.jpg"));
surfaceBrush.Surface = loadedSurface;

_effectBrush.SetSourceParameter("mySource", surfaceBrush);

_effectVisual = _compositor.CreateSpriteVisual();
_effectVisual.Brush = _effectBrush;
_effectVisual.Size = new Vector2(156, 156);

CompositionBrushes kullanarak Efekt oluşturma hakkında daha fazla bilgi için bkz. Görsel katmanındaki efektler

Opaklık maskesi uygulanmış bir CompositionBrush ile boyama

CompositionMaskBrush, bir alanı, üzerine opaklık maskesi uygulanmış bir CompositionBrush ile boyar. Opaklık maskesinin kaynağı CompositionColorBrush, CompositionLinearGradientBrush, CompositionSurfaceBrush, CompositionEffectBrush veya CompositionNineGridBrush türünde herhangi bir CompositionBrush olabilir. Opaklık maskesi bir CompositionSurfaceBrush olarak belirtilmelidir.

Aşağıdaki çizimde ve kodda CompositionMaskBrush ile boyanmış bir SpriteVisual gösterilmektedir. Maskenin kaynağı, daire şeklinde görünmesi için daire görüntüsü maske olarak kullanılarak maskelenmiş bir CompositionLinearGradientBrush'tır.

CompositionMaskBrush

Compositor _compositor;
SpriteVisual _maskVisual;
CompositionMaskBrush _maskBrush;

_compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

_maskBrush = _compositor.CreateMaskBrush();

CompositionLinearGradientBrush _sourceGradient = _compositor.CreateLinearGradientBrush();
_sourceGradient.ColorStops.Add(_compositor.CreateColorGradientStop(0,Colors.Red));
_sourceGradient.ColorStops.Add(_compositor.CreateColorGradientStop(1,Colors.Yellow));
_maskBrush.Source = _sourceGradient;

LoadedImageSurface loadedSurface = LoadedImageSurface.StartLoadFromUri(new Uri("ms-appx:///Assets/circle.png"), new Size(156.0, 156.0));
_maskBrush.Mask = _compositor.CreateSurfaceBrush(loadedSurface);

_maskVisual = _compositor.CreateSpriteVisual();
_maskVisual.Brush = _maskBrush;
_maskVisual.Size = new Vector2(156, 156);

NineGrid esnetme kullanarak bir CompositionBrush ile boyayın.

CompositionNineGridBrush, dokuz ızgara metaforu kullanılarak gerilmiş bir CompositionBrush ile bir alanı boyar. Dokuz bölmeli metafor, CompositionBrush'ın kenarlarını ve köşelerini merkezinden farklı olarak genişletmenize olanak tanır. Dokuz kılavuzlu esnetmenin kaynağı, CompositionColorBrush, CompositionSurfaceBrush veya CompositionEffectBrush türünde herhangi bir CompositionBrush olabilir.

Aşağıdaki kod, CompositionNineGridBrush ile boyanmış bir SpriteVisual gösterir. Maskenin kaynağı, Nine-Grid kullanılarak esnetilen bir CompositionSurfaceBrush'dır.

Compositor _compositor;
SpriteVisual _nineGridVisual;
CompositionNineGridBrush _nineGridBrush;

_compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

_nineGridBrush = _compositor.CreateNineGridBrush();

// nineGridImage.png is 50x50 pixels; nine-grid insets, as measured relative to the actual size of the image, are: left = 1, top = 5, right = 10, bottom = 20 (in pixels)
LoadedImageSurface _imageSurface = LoadedImageSurface.StartLoadFromUri(new Uri("ms-appx:///Assets/nineGridImage.png"));
CompositionSurfaceBrush sourceBrush = _compositor.CreateSurfaceBrush(_imageSurface);
_nineGridBrush.Source = sourceBrush;

// Set nine-grid insets.
_nineGridBrush.SetInsets(1, 5, 10, 20);

// Set the appropriate stretch on the SurfaceBrush for the center of the nine-grid.
sourceBrush.Stretch = CompositionStretch.Fill;

_nineGridVisual = _compositor.CreateSpriteVisual();
_nineGridVisual.Brush = _nineGridBrush;
_nineGridVisual.Size = new Vector2(100, 75);

Arka Plan Piksellerini Kullanarak Boyama

CompositionBackdropBrush, alanın arkasındaki içeriğe sahip bir alanı boyar. CompositionBackdropBrush hiçbir zaman kendi başına kullanılmaz, ancak bunun yerine EffectBrush gibi başka bir CompositionBrush'a giriş olarak kullanılır. Örneğin, Bir CompositionBackdropBrush'ı Bulanıklaştırma efektine giriş olarak kullanarak buzlu cam efekti elde edebilirsiniz.

Aşağıdaki kod, CompositionSurfaceBrush kullanarak görüntü oluşturmak için küçük bir görsel ağacı ve görüntünün üzerinde buzlu cam katmanını gösterir. Buzlu cam katman, resmin üzerine EffectBrush ile doldurulmuş bir SpriteVisual yerleştirilerek oluşturulur. EffectBrush, bulanıklaştırma efektine giriş olarak CompositionBackdropBrush kullanır.

Compositor _compositor;
ContainerVisual _containerVisual;
SpriteVisual _imageVisual;
SpriteVisual _backdropVisual;

_compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

// Create a container visual to host the visual tree.
_containerVisual = _compositor.CreateContainerVisual();

// Create _imageVisual and add it to the bottom of the container visual.
CompositionSurfaceBrush _licoriceBrush = _compositor.CreateSurfaceBrush();
LoadedImageSurface loadedSurface = LoadedImageSurface.StartLoadFromUri(new Uri("ms-appx:///Assets/licorice.jpg"));
_licoriceBrush.Surface = loadedSurface;

_imageVisual = _compositor.CreateSpriteVisual();
_imageVisual.Brush = _licoriceBrush;
_imageVisual.Size = new Vector2(156, 156);
_imageVisual.Offset = new Vector3(0, 0, 0);
_containerVisual.Children.InsertAtBottom(_imageVisual);

// Create a SpriteVisual and add it to the top of the container visual.
// Paint the visual with an EffectBrush that applies blur to the content underneath it.
GaussianBlurEffect blurEffect = new GaussianBlurEffect()
{
    Name = "Blur",
    BlurAmount = 1.0f,
    BorderMode = EffectBorderMode.Hard,
    Source = new CompositionEffectSourceParameter("source")
};

CompositionEffectFactory blurEffectFactory = _compositor.CreateEffectFactory(blurEffect);
CompositionEffectBrush _backdropBrush = blurEffectFactory.CreateBrush();

// Create a BackdropBrush and bind it to the EffectSourceParameter source.
_backdropBrush.SetSourceParameter("source", _compositor.CreateBackdropBrush());

_backdropVisual = _compositor.CreateSpriteVisual();
_backdropVisual.Brush = _backdropBrush;
_backdropVisual.Size = new Vector2(78, 78);
_backdropVisual.Offset = new Vector3(39, 39, 0);
_containerVisual.Children.InsertAtTop(_backdropVisual);

CompositionBrush'ları Birleştirme

Bazı CompositionBrush'lar giriş olarak diğer CompositionBrush'ları kullanır. Örneğin, SetSourceParameter yöntemini kullanarak başka bir CompositionBrush'ı CompositionEffectBrush'a girdi olarak ayarlayabilirsiniz. Aşağıdaki tabloda, Desteklenen CompositionBrushes birleşimleri özetlenmektedir. Desteklenmeyen bir birleşim kullanmanın özel durum oluşturacağını unutmayın.

Fırça EffectBrush.SetSourceParameter() MaskBrush.Mask MaskBrush.Source NineGridBrush.Source
CompositionColorBrush (BileşimRenkFırçası) EVET EVET EVET EVET
CompositionLinear
Gradyan Fırça
EVET EVET EVET HAYIR
CompositionSurfaceBrush EVET EVET EVET EVET
CompositionEffectBrush HAYIR HAYIR EVET HAYIR
CompositionMaskBrush HAYIR HAYIR HAYIR HAYIR
KompozisyonDokuzIzgaraFırçası EVET EVET EVET HAYIR
Bileşim Arka Plan Fırçası EVET HAYIR HAYIR HAYIR

XAML Fırçası ve CompositionBrush Kullanımı

Aşağıdaki tabloda senaryoların bir listesi ve uygulamanızda bir UIElement veya SpriteVisual boyanırken XAML veya Composition Brush kullanımının önerilip önerilmediği gösterilir.

Uyarı

XAML UIElement için bir CompositionBrush önerilirse, CompositionBrush'ın bir XamlCompositionBrushBase kullanılarak paketlendiği varsayılır.

Scenario XAML UIElement Composition SpriteVisual
Düz renkle bir alanı boyama SolidColorBrush CompositionColorBrush
Bir alanı animasyonlu renkle boyama SolidColorBrush CompositionColorBrush
Statik gradyan ile bir alanı boyama LinearGradientBrush CompositionLinearGradientBrush
Animasyonlu gradyan durakları olan bir alanı boyama CompositionLinearGradientBrush CompositionLinearGradientBrush
Bir alanı resimle boyama Imagebrush CompositionSurfaceBrush
Web sayfasıyla bir alanı boyama WebView2 Mevcut Değil
NineGrid genişletme kullanarak bir alanı resimle boyama Görüntü Denetimi CompositionNineGridBrush
Animasyonlu NineGrid esnetme teknolojisi ile bir alanı boyama CompositionNineGridBrush CompositionNineGridBrush
Bir alanı swapchain kullanarak boyama SwapChainPanel CompositionSurfaceBrush ile swapchain interop
Video ile bir alanı boyama MediaPlayerElement CompositionSurfaceBrush ile medya birlikte çalışması
Özel 2B çizimle bir alanı boyama Win2D'den CanvasControl CompositionSurfaceBrush ile Win2D etkileşimi
Animasyonsuz maske ile bir alanı boyama Maske tanımlamak için XAML şekillerini kullanma CompositionMaskBrush
Animasyonlu maske ile bir alanı boyama CompositionMaskBrush CompositionMaskBrush
Bir alanı animasyonlu filtre efektiyle boyama CompositionEffectBrush CompositionEffectBrush
Arka plan piksellerine efekt uygulanmış bir alanı boyama CompositionBackdropBrush CompositionBackdropBrush

BeginDraw ve EndDraw ile yerel DirectX ve Direct2D bileşimini birlikte çalışma

XamlCompositionBrushBase ile XAML Fırçası Birlikte Çalışabilirliği