Zobrazení objektů uživatelského rozhraní WinRT závislých na CoreWindow

Některé nástroje pro výběr, vyskakovací okna, dialogová okna a další objekty prostředí Windows Runtime (WinRT) závisí na CoreWindow, obvykle pro zobrazení uživatelského rozhraní. I když se CoreWindow v desktopových aplikacích nepodporuje (viz nepodporované třídy Core), můžete v desktopové aplikaci stále používat mnoho z těchto tříd WinRT přidáním trochu interoperačního kódu.

Vaše desktopová aplikace může být aplikací WinUI 3, Windows Presentation Foundation (WPF (Windows Presentation Foundation)), nebo model Windows Forms (WinForms). Příklady kódu jsou uvedeny v jazyce C# a C++/WinRT.

Nastavte popisovač okna vlastníka (HWND) pro WinRT objekt uživatelského rozhraní

Pro třídy, které implementují IInitializeWithWindow rozhraní (nebo ekvivalentní IDataTransferManagerInterop rozhraní), můžete toto rozhraní použít k nastavení okna vlastníka objektu před zobrazením. Jedná se o dvoustupňový proces.

  1. Rozhodněte se, které okno bude vlastníkem objektu uživatelského rozhraní, který chcete zobrazit, a načtěte HWND daného okna. Další podrobnosti a příklady kódu pro tento krok naleznete v tématu Načtení úchytu okna (HWND).
  2. Potom zavolejte příslušné rozhraní API pro interoperabilitu (pro C# nebo C++/WinRT) a nastavte popisovač okna vlastníka (HWND) pro objekt uživatelského rozhraní WinRT.

Pro třídy, které implementují IInitializeWithWindow

Tyto třídy implementují IInitializeWithWindow:

Poznámka:

Výše uvedený seznam je nutně neúplný – podívejte se do dokumentace k typu a zjistěte, jestli implementuje IInitializeWithWindow (nebo ekvivalentní rozhraní vzájemné spolupráce).

Další části obsahují příklady kódu pro zobrazení FolderPicker. Je to ale stejná technika, jak zobrazit některá z výše uvedených rozhraní API.

WinUI s C# (také WPF (Windows Presentation Foundation)/WinForms s .NET 6 nebo novějším)

Poznámka:

Příklady kódu v této části používají třídu spolupráce winRT.Interop.WindowNative C#. Pokud cílíte na .NET 6 nebo novější, můžete tuto třídu použít v WPF (Windows Presentation Foundation) nebo WinForms project. Pro informace o nastavení projektu, abyste toho dosáhli, se podívejte na Volání rozhraní API pro interoperabilitu z aplikace .NET.

Následující kód jazyka C# očekává, že jste už použili vzor zdokumentovaný v části Načtení úchytu okna (HWND). Pak, abyste nastavili okno vlastníka pro objekt uživatelského rozhraní, který chcete zobrazit, kód volá metodu Initialize ve třídě C# interop WinRT.Interop.InitializeWithWindow. Další informace o třídách interoperability jazyka C# najdete v tématu Volit rozhraní API pro interoperabilitu z aplikace .NET.

// MainWindow.xaml.cs
private async void ShowFolderPickerAsync(IntPtr hWnd)
{
    // Create a folder picker.
    var folderPicker = new Windows.Storage.Pickers.FolderPicker();

    // Initialize the folder picker with the window handle (HWND).
    WinRT.Interop.InitializeWithWindow.Initialize(folderPicker, hWnd);

    // Use the folder picker as usual.
    folderPicker.FileTypeFilter.Add("*");
    var folder = await folderPicker.PickSingleFolderAsync();
}

WinUI s C++

Níže uvedený kód C++/WinRT očekává, že jste už použili vzor zdokumentovaný v části Načtení úchytu okna (HWND). Pak chcete-li nastavit okno vlastník pro objekt uživatelského rozhraní, který chcete zobrazit, kód volá metodu interoperability IInitializeWithWindow::Initialize.

// pch.h
...
#include <microsoft.ui.xaml.window.h>
#include <Shobjidl.h>
#include <winrt/Windows.Storage.Pickers.h>

// MainWindow.xaml.cpp
winrt::fire_and_forget ShowFolderPickerAsync(HWND hWnd)
{
    // Create a folder picker.
    Windows::Storage::Pickers::FolderPicker folderPicker;

    // Initialize the folder picker with the window handle (HWND).
    auto initializeWithWindow{ folderPicker.as<::IInitializeWithWindow>() };
    initializeWithWindow->Initialize(hWnd);

    // Use the folder picker as usual.
    folderPicker.FileTypeFilter().Append(L"*");
    auto folder{ co_await folderPicker.PickSingleFolderAsync() };
}

Pro třídy, které implementují IDataTransferManagerInterop

Třída Windows.ApplicationModel.DataTransfer.DataTransferManager implementuje IDataTransferManagerInterop rozhraní (například IInitializeWithWindow, umožňuje nastavit okno vlastníka).

V desktopové aplikaci místo volání Metody DataTransferManager.ShowShareUI voláte IDataTransferManagerInterop::ShowShareUIForWindow, jak je znázorněno v příkladech kódu níže.

WinUI s C# (také WPF (Windows Presentation Foundation)/WinForms s .NET 6 nebo novějším)

// MainWindow.xaml.cs
...
public sealed partial class MainWindow : Window
{
    ...

    [System.Runtime.InteropServices.ComImport]
    [System.Runtime.InteropServices.Guid("3A3DCD6C-3EAB-43DC-BCDE-45671CE800C8")]
    [System.Runtime.InteropServices.InterfaceType(
        System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIUnknown)]
    interface IDataTransferManagerInterop
    {
        IntPtr GetForWindow([System.Runtime.InteropServices.In] IntPtr appWindow,
            [System.Runtime.InteropServices.In] ref Guid riid);
        void ShowShareUIForWindow(IntPtr appWindow);
    }

    static readonly Guid _dtm_iid = 
        new Guid(0xa5caee9b, 0x8708, 0x49d1, 0x8d, 0x36, 0x67, 0xd2, 0x5a, 0x8d, 0xa0, 0x0c);

    private void myButton_Click(object sender, RoutedEventArgs e)
    {
        // Retrieve the window handle (HWND) of the current WinUI window.
        var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);

        IDataTransferManagerInterop interop =
        Windows.ApplicationModel.DataTransfer.DataTransferManager.As
            <IDataTransferManagerInterop>();

        IntPtr result = interop.GetForWindow(hWnd, _dtm_iid);
        var dataTransferManager = WinRT.MarshalInterface
            <Windows.ApplicationModel.DataTransfer.DataTransferManager>.FromAbi(result);

        dataTransferManager.DataRequested += (sender, args) =>
        {
            args.Request.Data.Properties.Title = "In a desktop app...";
            args.Request.Data.SetText("...display WinRT UI objects that depend on CoreWindow.");
            args.Request.Data.RequestedOperation = 
                Windows.ApplicationModel.DataTransfer.DataPackageOperation.Copy;
        };

        // Show the Share UI
        interop.ShowShareUIForWindow(hWnd);
    }
}
...

WinUI s C++

// pch.h in a Windows App SDK app
...
#include <shobjidl_core.h>
#include <microsoft.ui.xaml.window.h>
#include <winrt/Windows.ApplicationModel.DataTransfer.h>
...

// MainWindow.xaml.cpp
...
void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
{
    // Retrieve the window handle (HWND) of the current WinUI window.
    auto windowNative{ this->m_inner.as<::IWindowNative>() };
    HWND hWnd{ 0 };
    windowNative->get_WindowHandle(&hWnd);

    winrt::com_ptr<IDataTransferManagerInterop> interop = 
        winrt::get_activation_factory<Windows::ApplicationModel::DataTransfer::DataTransferManager,
        IDataTransferManagerInterop>();

    winrt::guid _dtm_iid{ 0xa5caee9b, 0x8708, 0x49d1, { 0x8d, 0x36, 0x67, 0xd2, 0x5a, 0x8d, 0xa0, 0x0c } };
    Windows::ApplicationModel::DataTransfer::DataTransferManager dataTransferManager{ nullptr };
    interop->GetForWindow(hWnd, _dtm_iid, winrt::put_abi(dataTransferManager));

    dataTransferManager.DataRequested([](Windows::ApplicationModel::DataTransfer::DataTransferManager const& /* sender */,
        Windows::ApplicationModel::DataTransfer::DataRequestedEventArgs const& args)
    {
        args.Request().Data().Properties().Title(L"In a desktop app...");
        args.Request().Data().SetText(L"...display WinRT UI objects that depend on CoreWindow.");
        args.Request().Data().RequestedOperation(Windows::ApplicationModel::DataTransfer::DataPackageOperation::Copy);
    });

    interop->ShowShareUIForWindow(hWnd);
}
...

Pro třídy, které implementují IUserConsentVerifierInterop

Třída Windows.Security.Credentials.UI.UserConsentVerifier implementuje rozhraní IUserConsentVerifierInterop (například IInitializeWithWindow, umožňuje nastavit okno vlastníka).

V desktopové aplikaci místo volání metody UserConsentVerifier.RequestVerificationAsync :

Další informace a příklady kódu najdete v tématu UserConsentVerifier.

Pro třídy, které implementují další rozhraní vzájemné spolupráce

Tato rozhraní mají XxxForWindow metody, které umožňují nastavit úchyt okna vlastníka (HWND). Tato rozhraní můžete použít přímo z C++/WinRT. Verze rozhraní existují také ve formě tříd jazyka C# – další podrobnosti najdete v tématu Volit rozhraní API pro interoperabilitu z aplikace .NET.