Я использовал API CreateTargetForCurrentView, вызывая его для объекта Compositor UIElement, извлеченного с помощью auto visual = ElementCompositionPreview :: GetElementVisual (elem); автоматический композитор = визуальный -...

0
Zoso 3 Мар 2021 в 14:34

1 ответ

Лучший ответ

Если вы хотите взаимодействовать между XAML и визуальным слоем, нам не следует связываться с CompositionTarget. Вернемся к тому, как использовать ContainerVisual для создания визуального дерева. См. Документ < / a>, мы могли бы использовать метод ElementCompositionPreview.GetElementVisual(UIElement) для захвата визуального элемента поддержки для любого элемента страницы и использовать ElementCompositionPreview.SetElementChildVisual (UIElement, Visual) для переноса созданного визуала в визуальное дерево UIElement. В приведенном выше документе и этом документе есть код Использование визуального слоя с XAML, показывающее, как захватить визуал из UIElement и установить визуальный элемент на UIElement.

Вот пример кода, на который вы можете сослаться:

Добавьте пространства имен и заголовок:

#include "windowsnumerics.h"

using namespace Windows::UI::Xaml::Hosting;
using namespace Windows::UI::Composition;
using namespace Windows::Foundation::Numerics;
using namespace Windows::UI;

Объявите некоторых участников:

private:
    Compositor^ _compositor;
    ContainerVisual^ _root;
    Visual^ CreateChildElement();

Код для захвата визуального элемента и установки визуального элемента:

void App2::MainPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    _compositor = ElementCompositionPreview::GetElementVisual(this)->Compositor;
    _root = _compositor->CreateContainerVisual();
    for (int i = 0; i < 5; i++)
    {
        _root->Children->InsertAtTop(CreateChildElement());
    }
    ElementCompositionPreview::SetElementChildVisual(this, _root);

}

Visual^ App2::MainPage::CreateChildElement()
{
    auto element = _compositor->CreateContainerVisual();
    element->Size = float2(100.0f, 100.0f);

    //
    // Position this visual randomly within our window
    //
    element->Offset = float3(((float)rand() / RAND_MAX) * 400, ((float)rand() / RAND_MAX) * 400, 0.0f);

    //
    // The outer rectangle is always white
    //
    auto visual = _compositor->CreateSpriteVisual();
    element->Children->InsertAtTop(visual);
    visual->Brush = _compositor->CreateColorBrush(ColorHelper::FromArgb(0xFF, 0xFF, 0x11, 0xFF));
    visual->Size = float2(100.0f, 100.0f);

    //
    // The inner rectangle is inset from the outer by three pixels all around
    //
    auto child = _compositor->CreateSpriteVisual();
    visual->Children->InsertAtTop(child);
    child->Offset = float3(3.0f, 3.0f, 0.0f);
    child->Size = float2(94.0f, 94.0f);

    //
    // Pick a random color for every rectangle
    //
    byte red = (byte)(0xFF * (0.2f + (((float)rand()/RAND_MAX) / 0.8f)));
    byte green = (byte)(0xFF * (0.2f + (((float)rand() / RAND_MAX) / 0.8f)));
    byte blue = (byte)(0xFF * (0.2f + (((float)rand() / RAND_MAX) / 0.8f)));
    child->Brush = _compositor->CreateColorBrush(ColorHelper::FromArgb(0xFF, red, green, blue));

    //
    // Make the subtree root visual partially transparent. This will cause each visual in the subtree
    // to render partially transparent, since a visual's opacity is multiplied with its parent's
    // opacity
    //
    element->Opacity = 0.8f;

    return element;

}
0
YanGu - MSFT 5 Мар 2021 в 09:18