XAML 如何继承或重写WinUI 3控件的Default样式的元素?

vmpqdwk3  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(173)

我试图学习如何在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的指针,我将不胜感激。

13z8s7eq

13z8s7eq1#

在您的情况下,高度很可能不起作用,因为page.resources在对象初始化之前编译,并且CurrentMenuItemHeight的高度为0。要解决此问题,只需将模式设置为一种方式

{Binding ViewModel.CurrentMenuItemHeight,Mode=OneWay , ElementName=shellPage}

当你想使用BasedOn时,只需说BasedOn={ThemeResource styleName}。只需确保该样式实际上是在通用的.xaml文件中定义的,该文件可以在“C:\Users\AdminName.nuget\packages\microsoft.windowsappsdk\1.1.1\lib\uap10.0\Microsoft.UI\Themes”中找到
所以你的最终页面。资源应该是这样的:

<Page.Resources>    
<Style TargetType="NavigationViewItem" >
    <Setter Property="FontSize" Value="{Binding ViewModel.RootShellFontSize, ElementName=shellPage}" />
    <Setter Property="Height" Value="{Binding ViewModel.CurrentMenuItemHeight, Mode=OneWay, ElementName=shellPage}" />
</Style>    
</Page.Resources>

但是使用x:Bind而不是Binding会更好。您可以查看此页面了解更多关于它的信息https://learn.microsoft.com/en-US/windows/uwp/data-binding/data-binding-in-depth

相关问题