Aracılığıyla paylaş


CoreWindow'a bağlı WinRT kullanıcı arabirimi nesnelerini görüntüleme

Bazı seçiciler, açılır pencereler, diyaloglar ve diğer Windows Çalışma Zamanı (WinRT) nesneleri genellikle bir kullanıcı arayüzü (UI) görüntülemek için CoreWindowbağlıdır. CoreWindow masaüstü uygulamalarında desteklenmese de (bkz. Çekirdek desteklenmeyen sınıflar), biraz birlikte çalışma kodu ekleyerek bu WinRT sınıflarının çoğunu masaüstü uygulamanızda kullanmaya devam edebilirsiniz.

Masaüstü uygulamanız WinUI 3, Windows Presentation Foundation (WPF) veya Windows Forms (WinForms) uygulamaları olabilir. Kod örnekleri C# ve C++/WinRT'de sunulur.

WinRT UI nesnesi için sahip pencere tutamacını (HWND) ayarlama

IInitializeWithWindow arabirimini (veya eşdeğer IDataTransferManagerInterop arabirimini) uygulayan sınıflar için, görüntülemeden önce nesne üzerinde sahip penceresi ayarlamak için bu arabirimi kullanabilirsiniz. bu iki adımlı bir işlemdir.

  1. Görüntülemek istediğiniz kullanıcı arabirimi nesnesinin sahibi olacak pencereye karar verin ve bu pencerenin HWND değerini alın. Bu adımla ilgili diğer ayrıntılar ve kod örnekleri için bkz. Pencere tutamacını alma (HWND).
  2. Ardından, WinRT UI nesnesi için sahip pencere tutamacını (HWND) ayarlamak üzere uygun birlikte çalışabilirlik API'sini (C# veya C++/WinRT için) çağırın.

IInitializeWithWindow uygulayan sınıflar için

Bu sınıflar IInitializeWithWindow uygular:

Uyarı

Yukarıdaki liste eksik olabilir—bir türün IInitializeWithWindow (veya eşdeğer bir birlikte çalışma arabirimi) uygulayıp uygulamadığını görmek için belgelerine başvurun.

Sonraki bölümlerde FolderPicker'ı görüntülemek için kod örnekleri yer alır. Ancak yukarıda listelenen API'lerden herhangi birini görüntülemek aynı tekniktir.

C# ile WinUI 3 (Ayrıca .NET 6 veya daha yenisi ile WPF/WinForms)

Uyarı

Bu bölümdeki kod örnekleri WinRT.Interop.WindowNative C# birlikte çalışma sınıfını kullanır. .NET 6 veya sonraki bir sürümü hedeflerseniz, bu sınıfı bir WPF veya WinForms projesinde kullanabilirsiniz. Projenizi bunu yapacak şekilde ayarlama hakkında bilgi için bkz. bir .NET uygulamasından interop API'lerini çağırma.

Aşağıdaki C# kodu, Pencere tutamacını almak (HWND)için belgelenmiş olan deseni zaten kullandığınızı varsayar. Ardından, görüntülemek istediğiniz ui nesnesinin sahip penceresini ayarlamak için kod, WinRT.Interop.InitializeWithWindow C# birlikte çalışma sınıfında Initialize yöntemini çağırır. C# birlikte çalışma sınıfları hakkında daha fazla bilgi için bkz. .NET uygulamasından birlikte çalışma API'lerini çağırma.

// 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();
}

C++ ile WinUI 3

Aşağıdaki C++/WinRT kodu, Pencere tutamacını alma (HWND)belgesinde açıklanan desenini zaten uyguladığınızı öngörmektedir. Ardından, görüntülemek istediğiniz UI nesnesinin sahip penceresini ayarlamak için kod , IInitializeWithWindow::Initialize birlikte çalışabilirlik yöntemini çağırır.

// 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() };
}

IDataTransferManagerInterop uygulayan sınıflar için

Windows.ApplicationModel.DataTransfer.DataTransferManager sınıfı, IInitializeWithWindowgibi, bir sahip pencere ayarlamanıza olanak sağlayan IDataTransferManagerInterop arabirimini uygular.

Bir masaüstü uygulamasında, DataTransferManager.ShowShareUI yöntemini çağırmak yerine, aşağıdaki kod örneklerinde gösterildiği gibi IDataTransferManagerInterop::ShowShareUIForWindow'u çağırırsınız.

C# ile WinUI 3 (Ayrıca .NET 6 veya daha yenisi ile WPF/WinForms)

// 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 3 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);
    }
}
...

C++ ile WinUI 3

// 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 3 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);
}
...

IUserConsentVerifierInterop uygulayan sınıflar için

Windows.Security.Credentials.UI.UserConsentVerifier sınıfı IUserConsentVerifierInterop arabirimini uygular (IInitializeWithWindowgibi) sahip penceresi ayarlamanıza olanak tanır.

Bir masaüstü uygulamasında UserConsentVerifier.RequestVerificationAsync yöntemini çağırmak yerine:

Daha fazla bilgi ve kod örnekleri için bkz. UserConsentVerifier.

Diğer birlikte çalışma arabirimlerini uygulayan sınıflar için

Bu arabirimler, sahip pencere tutamacını (HWND) ayarlamanıza olanak tanıyan XxxForWindow yöntemlerine sahiptir. Bu arabirimleri doğrudan C++/WinRT'den kullanabilirsiniz. Arabirimlerin sürümleri C# sınıfları biçiminde de mevcuttur. Daha fazla ayrıntı için bkz. .NET uygulamasından birlikte çalışma API'lerini çağırma.