我试图学习如何在WinUI 3(来自WindowsAppSDK 1.1.1)中最有效地使用样式,但我很难让简单的继承工作。
考虑NavigationViewItem类。我想修改默认样式以绑定FontSize和Height属性。以下代码在我的Page XAML中有效:
<NavigationViewItem x:Uid="Shell_05" helpers:NavigationHelper.NavigateTo="ViewModels._05CreditViewModel"
FontSize="{Binding ViewModel.RootShellFontSize, ElementName=shellPage}"
Height="{Binding ViewModel.CurrentMenuItemHeight, ElementName=shellPage}">
<NavigationViewItem.Icon>
<BitmapIcon UriSource="\Images\credit.png"/>
</NavigationViewItem.Icon>
</NavigationViewItem>
但是,将这两个属性添加到页面资源中则不起作用(尽管FontSize属性在以下每种情况下都起作用,但Height属性不起作用):
<Page.Resources>
<Style TargetType="NavigationViewItem" >
<Setter Property="FontSize" Value="{Binding ViewModel.RootShellFontSize, ElementName=shellPage}" />
<Setter Property="Height" Value="{Binding ViewModel.CurrentMenuItemHeight, ElementName=shellPage}" />
</Style>
</Page.Resources>
将样式添加到资源字典和合并也不起作用。我已经阅读了我所能找到的关于继承样式的内容,并且BasedOn="”扩展是从WinUI 2.6之前的版本中的现有样式派生的显式方法(我认为)。显然,WinUI 3不需要BasedOn。在任何情况下,简单地指定TargetType="NavigationViewItem"
都不起作用,但是也不起作用
<Style TargetType="controls:NavigationViewItem" BasedOn="DefaultNavigationViewItemStyle">
SDK v1.1.1的源代码在通用.xaml中声明了NavigationViewItem的默认样式,但没有DefaultNavigationViewItemStyle的定义。
我也无法使用
<Style TargetType="controls:NavigationViewItem" BasedOn="{StaticResource {x:Type NavigationViewItem}}">
因为x:Type
未定义。
我可以在代码中完成所有我想要的绑定,但是我认为在XAML中完成绑定更清晰、更高效。
请问,如何继承、派生或重写桌面应用程序中WinUI 3控件(不是自定义控件)的默认样式的一部分?
感谢您的帮助。如果您能提供WinUI 3文档(或书籍和文章)的良好XAML的指针,我将不胜感激。
1条答案
按热度按时间13z8s7eq1#
在您的情况下,高度很可能不起作用,因为page.resources在对象初始化之前编译,并且CurrentMenuItemHeight的高度为0。要解决此问题,只需将模式设置为一种方式
当你想使用BasedOn时,只需说
BasedOn={ThemeResource styleName}
。只需确保该样式实际上是在通用的.xaml文件中定义的,该文件可以在“C:\Users\AdminName.nuget\packages\microsoft.windowsappsdk\1.1.1\lib\uap10.0\Microsoft.UI\Themes”中找到所以你的最终页面。资源应该是这样的:
但是使用x:Bind而不是Binding会更好。您可以查看此页面了解更多关于它的信息https://learn.microsoft.com/en-US/windows/uwp/data-binding/data-binding-in-depth