Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Windows 11- anyagai olyan vizuális effektusok, amelyek valós műtárgyakhoz hasonló UX-felületekre vonatkoznak. Az olyan elzárt anyagok, mint a Mica és az Akril, alaprétegként szolgálnak az interaktív felhasználói felület vezérlői alatt.
Mica egy átlátszatlan anyag, amely magában foglalja a felhasználó témáját és asztali háttérképét, hogy egy nagyon személyre szabott megjelenést hozzon létre. A Mica teljesítményre van tervezve, mivel csak egyszer rögzíti a háttérképet a vizualizáció létrehozásához, ezért az alkalmazás alaprétegéhez ajánljuk, különösen a címsor területén.
Akril egy félig átlátszó anyag, amely replikálja a fagyos üveg hatását. Csak átmeneti, fényelzárási felületekhez, például úszó panelekhez és helyi menükhöz használható.
Ez a cikk bemutatja, hogyan alkalmazható a Mica vagy az Akril a Windows App SDK/WinUI 3 XAML-alkalmazás alaprétegeként.
Jegyzet
- Alkalmazáson belüli AcrylicBrush használatához lásd Akril-anyag.
- Ha háttéranyagokat szeretne használni egy Win32-alkalmazásban, olvassa el Mica alkalmazása Windows 11-hez készült asztali Win32-alkalmazásokban.
- Ha háttéranyagokat szeretne használni egy UWP/WinUI 2 alkalmazásban, tekintse meg a következőt: Mica alkalmazása WinUI 2-vel UWP-hez vagy Akril anyag.
Háttéranyag használata
A WinUI 3 Gallery alkalmazás interaktív példákat tartalmaz a legtöbb WinUI 3 vezérlőre, funkcióra és funkcionalitásra. Az alkalmazás letöltése a Microsoft Store vagy a forráskód letöltése a GitHub- oldaláról.
Ha az alkalmazásban Mica- vagy Akryl-anyagot szeretne alkalmazni, állítsa be a SystemBackdrop
tulajdonságot XAML SystemBackdrop (ez általában az egyik beépített háttérrendszer, például a MicaBackdrop vagy a DesktopAcrylicBackdrop) értékére.
Ezek az elemek SystemBackdrop
tulajdonságot tartalmaznak:
- CommandBarFlyoutCommandBar.SystemBackdrop
- ContentIsland.SystemBackdrop
- DesktopWindowXamlSource.SystemBackdrop
- FlyoutBase.SystemBackdrop
- MenuFlyoutPresenter.SystemBackdrop
- Popup.SystemBackdrop
- Window.SystemBackdrop
Ezek a példák bemutatják, hogyan állíthatja be a rendszer háttérrendszerét XAML-ben és kódban.
Csillám
A Mica általában egy alkalmazásablak háttérrendszereként használatos.
<Window
... >
<Window.SystemBackdrop>
<MicaBackdrop Kind="BaseAlt"/>
</Window.SystemBackdrop>
</Window>
public MainWindow()
{
this.InitializeComponent();
SystemBackdrop = new MicaBackdrop()
{ Kind = MicaKind.BaseAlt };
}
Akril
Az akrilt általában átmeneti felhasználói felület, például úszó panel háttérként használják.
<Flyout
... >
<Flyout.SystemBackdrop>
<DesktopAcrylicBackdrop/>
</Flyout.SystemBackdrop>
</Flyout>
Flyout flyout = new Flyout()
{
SystemBackdrop = new DesktopAcrylicBackdrop()
};
Rendszer háttérvezérlő használata
Jegyzet
A Windows App SDK 1.3-as verziójától kezdve anyagot alkalmazhat azáltal, hogy a Window.SystemBackdrop
tulajdonságot egy XAML SystemBackdrop
-re állítja, az előző szakaszban leírtak szerint. Ez az anyag alkalmazásának ajánlott módja.
A cikk további része bemutatja, hogyan használható a Composition MicaController és DesktopAcrylicController API-k.
Ha háttéranyagot szeretne használni az alkalmazásban, használhatja a ISystemBackdropController felületet implementáló vezérlők egyikét (MicaController vagy DesktopAcrylicController). Ezek az osztályok kezelik a rendszer háttéranyagának renderelését, valamint az anyag rendszerszabályzatának kezelését.
A Mica háttéranyagként való használatához hozzon létre egy MicaController objektumot. Az Acrylic használatához hozzon létre egy DesktopAcrylicController objektumot. A beállítási és a támogató kód minden rendszer-háttéranyagtípus esetében megegyezik.
Ez a kód bemutatja, hogyan hozhat létre egy MicaController
elemet.
MicaController m_backdropController;
bool TrySetSystemBackdrop()
{
if (MicaController.IsSupported())
{
...
m_backdropController = new MicaController();
...
}
}
// namespace MUCSB = Microsoft::UI::Composition::SystemBackdrops;
winrt::MUCSB::MicaController m_backdropController{ nullptr };
void SetBackground()
{
if (winrt::MUCSB::MicaController::IsSupported())
{
...
m_backdropController = winrt::MUCSB::MicaController();
...
}
}
A Mica Alt változat használatához hozzon létre egy MicaController
objektumot, és állítsa be a Kind tulajdonságot a MicaKind.BaseAltértékre.
MicaController m_backdropController;
bool TrySetSystemBackdrop()
{
if (MicaController.IsSupported())
{
...
m_backdropController = new MicaController()
{
Kind = MicaKind.BaseAlt
};
...
}
}
// namespace MUCSB = Microsoft::UI::Composition::SystemBackdrops;
winrt::MUCSB::MicaController m_backdropController{ nullptr };
void SetBackground()
{
if (winrt::MUCSB::MicaController::IsSupported())
{
...
m_backdropController = winrt::MUCSB::MicaController();
m_backdropController.Kind(winrt::MUCSB::MicaKind::BaseAlt);
...
}
}
Ez a kód bemutatja, hogyan hozhat létre DesktopAcrylicController
.
DesktopAcrylicController m_backdropController;
bool TrySetSystemBackdrop()
{
if (DesktopAcrylicController.IsSupported())
{
...
m_backdropController = new DesktopAcrylicController();
...
}
}
// namespace MUCSB = Microsoft::UI::Composition::SystemBackdrops;
winrt::MUCSB::DesktopAcrylicController m_backdropController{ nullptr };
void SetBackground()
{
if (winrt::MUCSB::DesktopAcrylicController::IsSupported())
{
...
m_backdropController = winrt::MUCSB::DesktopAcrylicController();
...
}
}
A vezérlő alapértelmezés szerint reagál a rendszer világos és sötét témáira. A viselkedés felülbírálásához a következő tulajdonságokat állíthatja be a vezérlőn:
Jegyzet
A vezérlő négy tulajdonságának testreszabása után már nem alkalmazza az alapértelmezett világos vagy sötét értékeket, amikor a társított SystemBackdropConfiguration.Theme megváltozik. Ezeket a tulajdonságokat manuálisan kell frissítenie, hogy megfeleljenek az új témának.
A háttéranyag alkalmazásbeli használatához a következő elemekre van szükség:
Rendszer támogatás
A rendszernek, ahol az alkalmazás fut, támogatnia kell a háttéranyagot. Hívja meg a MicaController.IsSupported vagy DesktopAcrylicController.IsSupported metódust, hogy a háttéranyag futásidőben is támogatott legyen.
Érvényes cél
Meg kell adnia egy célt, amely implementálja az ICompositionSupportsSystemBackdrop felületet. Egy XAML-alkalmazásban az XAML Ablak implementálja ezt a felületet, és háttérbeli célként használja.
SystemBackdropConfiguration objektum
A SystemBackdropConfiguration alkalmazásspecifikus szabályzatinformációkat biztosít a rendszer háttérrendszer-anyagának megfelelő konfigurálásához.
Egy DispatcherQueue objektum.
A fő XAML-szálon egy elérhető Windows.System.DispatcherQueue-nek kell lennie. Tekintse meg a
WindowsSystemDispatcherQueueHelper
osztályt a példakódban vagy a WinUI 3 Galéria példában ().
Példa: A Mica használata Windows AppSDK/WinUI 3-alkalmazásokban
Ez a példa bemutatja, hogyan állíthatja be a Mica háttéranyagot egy XAML-alkalmazásban.
Borravaló
Tekintse meg az alábbi példaprojekteket a GitHubon:
C#: SampleSystemBackdropsWindow a WinUI3 katalógusban.
C++/WinRT: Windows App SDK Mica példa.
using Microsoft.UI.Composition.SystemBackdrops;
using Microsoft.UI.Xaml;
using System.Runtime.InteropServices; // For DllImport
using WinRT; // required to support Window.As<ICompositionSupportsSystemBackdrop>()
public sealed partial class MainWindow : Window
{
WindowsSystemDispatcherQueueHelper m_wsdqHelper; // See below for implementation.
MicaController m_backdropController;
SystemBackdropConfiguration m_configurationSource;
public MainWindow()
{
this.InitializeComponent();
TrySetSystemBackdrop();
}
bool TrySetSystemBackdrop()
{
if (Microsoft.UI.Composition.SystemBackdrops.MicaController.IsSupported())
{
m_wsdqHelper = new WindowsSystemDispatcherQueueHelper();
m_wsdqHelper.EnsureWindowsSystemDispatcherQueueController();
// Create the policy object.
m_configurationSource = new SystemBackdropConfiguration();
this.Activated += Window_Activated;
this.Closed += Window_Closed;
((FrameworkElement)this.Content).ActualThemeChanged += Window_ThemeChanged;
// Initial configuration state.
m_configurationSource.IsInputActive = true;
SetConfigurationSourceTheme();
m_backdropController = new Microsoft.UI.Composition.SystemBackdrops.MicaController();
// Enable the system backdrop.
// Note: Be sure to have "using WinRT;" to support the Window.As<...>() call.
m_backdropController.AddSystemBackdropTarget(this.As<Microsoft.UI.Composition.ICompositionSupportsSystemBackdrop>());
m_backdropController.SetSystemBackdropConfiguration(m_configurationSource);
return true; // succeeded
}
return false; // Mica is not supported on this system
}
private void Window_Activated(object sender, WindowActivatedEventArgs args)
{
m_configurationSource.IsInputActive = args.WindowActivationState != WindowActivationState.Deactivated;
}
private void Window_Closed(object sender, WindowEventArgs args)
{
// Make sure any Mica/Acrylic controller is disposed
// so it doesn't try to use this closed window.
if (m_backdropController != null)
{
m_backdropController.Dispose();
m_backdropController = null;
}
this.Activated -= Window_Activated;
m_configurationSource = null;
}
private void Window_ThemeChanged(FrameworkElement sender, object args)
{
if (m_configurationSource != null)
{
SetConfigurationSourceTheme();
}
}
private void SetConfigurationSourceTheme()
{
switch (((FrameworkElement)this.Content).ActualTheme)
{
case ElementTheme.Dark: m_configurationSource.Theme = Microsoft.UI.Composition.SystemBackdrops.SystemBackdropTheme.Dark; break;
case ElementTheme.Light: m_configurationSource.Theme = Microsoft.UI.Composition.SystemBackdrops.SystemBackdropTheme.Light; break;
case ElementTheme.Default: m_configurationSource.Theme = Microsoft.UI.Composition.SystemBackdrops.SystemBackdropTheme.Default; break;
}
}
}
class WindowsSystemDispatcherQueueHelper
{
[StructLayout(LayoutKind.Sequential)]
struct DispatcherQueueOptions
{
internal int dwSize;
internal int threadType;
internal int apartmentType;
}
[DllImport("CoreMessaging.dll")]
private static extern int CreateDispatcherQueueController([In] DispatcherQueueOptions options, [In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object dispatcherQueueController);
object m_dispatcherQueueController = null;
public void EnsureWindowsSystemDispatcherQueueController()
{
if (Windows.System.DispatcherQueue.GetForCurrentThread() != null)
{
// one already exists, so we'll just use it.
return;
}
if (m_dispatcherQueueController == null)
{
DispatcherQueueOptions options;
options.dwSize = Marshal.SizeOf(typeof(DispatcherQueueOptions));
options.threadType = 2; // DQTYPE_THREAD_CURRENT
options.apartmentType = 2; // DQTAT_COM_STA
CreateDispatcherQueueController(options, ref m_dispatcherQueueController);
}
}
}
// pch.h
...
#include <winrt/Microsoft.UI.Composition.SystemBackdrops.h>
#include <winrt/Windows.System.h>
#include <dispatcherqueue.h>
// MainWindow.xaml.h
...
namespace winrt
{
namespace MUC = Microsoft::UI::Composition;
namespace MUCSB = Microsoft::UI::Composition::SystemBackdrops;
namespace MUX = Microsoft::UI::Xaml;
namespace WS = Windows::System;
}
...
struct MainWindow : MainWindowT<MainWindow>
{
winrt::MUCSB::SystemBackdropConfiguration m_configuration{ nullptr };
winrt::MUCSB::MicaController m_backdropController{ nullptr };
winrt::MUX::Window::Activated_revoker m_activatedRevoker;
winrt::MUX::Window::Closed_revoker m_closedRevoker;
winrt::MUX::FrameworkElement::ActualThemeChanged_revoker m_themeChangedRevoker;
winrt::MUX::FrameworkElement m_rootElement{ nullptr };
winrt::WS::DispatcherQueueController m_dispatcherQueueController{ nullptr };
MainWindow::MainWindow()
{
InitializeComponent();
SetBackground();
m_closedRevoker = this->Closed(winrt::auto_revoke, [&](auto&&, auto&&)
{
if (nullptr != m_backdropController)
{
m_backdropController.Close();
m_backdropController = nullptr;
}
if (nullptr != m_dispatcherQueueController)
{
m_dispatcherQueueController.ShutdownQueueAsync();
m_dispatcherQueueController = nullptr;
}
});
}
void SetBackground()
{
if (winrt::MUCSB::MicaController::IsSupported())
{
// We ensure that there is a Windows.System.DispatcherQueue on the current thread.
// Always check if one already exists before attempting to create a new one.
if (nullptr == winrt::WS::DispatcherQueue::GetForCurrentThread() &&
nullptr == m_dispatcherQueueController)
{
m_dispatcherQueueController = CreateSystemDispatcherQueueController();
}
// Setup the SystemBackdropConfiguration object.
SetupSystemBackdropConfiguration();
// Setup Mica on the current Window.
m_backdropController = winrt::MUCSB::MicaController();
m_backdropController.SetSystemBackdropConfiguration(m_configuration);
m_backdropController.AddSystemBackdropTarget(
this->m_inner.as<winrt::MUC::ICompositionSupportsSystemBackdrop>());
}
else
{
// The backdrop material is not supported.
}
}
winrt::WS::DispatcherQueueController CreateSystemDispatcherQueueController()
{
DispatcherQueueOptions options
{
sizeof(DispatcherQueueOptions),
DQTYPE_THREAD_CURRENT,
DQTAT_COM_NONE
};
::ABI::Windows::System::IDispatcherQueueController* ptr{ nullptr };
winrt::check_hresult(CreateDispatcherQueueController(options, &ptr));
return { ptr, take_ownership_from_abi };
}
void SetupSystemBackdropConfiguration()
{
m_configuration = winrt::MUCSB::SystemBackdropConfiguration();
// Activation state.
m_activatedRevoker = this->Activated(winrt::auto_revoke,
[&](auto&&, MUX::WindowActivatedEventArgs const& args)
{
m_configuration.IsInputActive(
winrt::MUX::WindowActivationState::Deactivated != args.WindowActivationState());
});
// Initial state.
m_configuration.IsInputActive(true);
// Application theme.
m_rootElement = this->Content().try_as<winrt::MUX::FrameworkElement>();
if (nullptr != m_rootElement)
{
m_themeChangedRevoker = m_rootElement.ActualThemeChanged(winrt::auto_revoke,
[&](auto&&, auto&&)
{
m_configuration.Theme(
ConvertToSystemBackdropTheme(m_rootElement.ActualTheme()));
});
// Initial state.
m_configuration.Theme(
ConvertToSystemBackdropTheme(m_rootElement.ActualTheme()));
}
}
winrt::MUCSB::SystemBackdropTheme ConvertToSystemBackdropTheme(
winrt::MUX::ElementTheme const& theme)
{
switch (theme)
{
case winrt::MUX::ElementTheme::Dark:
return winrt::MUCSB::SystemBackdropTheme::Dark;
case winrt::MUX::ElementTheme::Light:
return winrt::MUCSB::SystemBackdropTheme::Light;
default:
return winrt::MUCSB::SystemBackdropTheme::Default;
}
}
...
};
...
Kapcsolódó cikkek
Windows developer