AvaloniaUI 样式-伪类

如何解决AvaloniaUI 样式-伪类

我正在 avalonia 和大多数作品中尝试样式,除了伪类,它们只是被忽略了。

我创建了一个窗口,所有样式都在那里,我创建了一个用户控件(带有一个按钮 - 伪类在按钮上),使用样式。我不使用代码,只使用 xaml 来定义样式。

我已经在按钮的“样式选择器”中尝试了“Button:pseudoclassname”和“Button.le:pseudoclassname”。我也尝试过“Button:pointerover”和“Button:hover”,因为文档提到可以修改。没有结果。伪类的样式全部被忽略,其他的都正确执行。

是我做错了什么还是 avalonia 中的一个错误

xaml windows 文件

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:views="clr-namespace:Hub.Views"
        xmlns:vm="using:Hub.viewmodels"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
        x:Class="Hub.Views.MainWindow"
        Icon="/Assets/avalonia-logo.ico"
        Width="200" Height="300"
        Title="Hub"
        Classes="le">

    <Window.Styles>
        <Style Selector="Window.le">
            <Setter Property="Background" Value="#191919"/>
        </Style>
        <Style Selector="Button.le">
            <Setter Property="Background" Value="green"/>
            <Setter Property="Foreground" Value="white"/>
        </Style>
        <Style Selector="Button.le:pointerover">
            <Setter Property="Background" Value="red"/>
            <Setter Property="Foreground" Value="white"/>
        </Style>
        <Style Selector="Button.le:pressed">
            <Setter Property="Background" Value="blue"/>
            <Setter Property="Foreground" Value="white"/>
        </Style>
        <Style Selector="TextBlock.le_update">
            <Setter Property="FontStyle" Value="Italic"/>
            <Setter Property="FontSize" Value="17"/>
            <Setter Property="FontFamily" Value="Arial,Verdana"/>
            <Setter Property="Foreground" Value="white"/>
            <Setter Property="Background" Value="transparent"/>
        </Style>
    </Window.Styles>
    
    <views:UpdateView/>

</Window>

xaml 用户控制文件

<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
             x:Class="Hub.Views.UpdateView">
    <DockPanel>
        <StackPanel DockPanel.Dock="Bottom">
            <Button Classes="le" HorizontalAlignment="Center" HorizontalContentAlignment="Center" Width="300">
                Check for updates
            </Button>
        </StackPanel>
        <StackPanel Spacing="5" Margin="5">
            <TextBlock Classes="le_update" HorizontalAlignment="Center" Margin="4">
                No updates for Hub.
            </TextBlock>
            <TextBlock Classes="le_update" HorizontalAlignment="Center" Margin="4">
                No updates for Engine.
            </TextBlock>
        </StackPanel>
    </DockPanel>
</UserControl>

解决方法

ButtonBackground 属性确实会受到您的风格的影响,但此时它对实际的Button'没有影响s 背景,因为 Background 属性仅控制按钮的正常状态。

如果您查看默认的 Button 样式 here,您会发现它通过 ContentPresenter 将其背景传递给 TemplateBinding

    <Setter Property="Template">
      <ControlTemplate>
        <ContentPresenter x:Name="PART_ContentPresenter"
                          Background="{TemplateBinding Background}"

但以如下样式覆盖 ContentPresenter 的背景:

  <Style Selector="Button:pointerover /template/ ContentPresenter#PART_ContentPresenter">
    <Setter Property="Background" Value="{DynamicResource ButtonBackgroundPointerOver}" />

由于实际绘制背景的是 ContentPresenterButton 是一个无外观的控件),您将看到带有 ButtonBackgroundPointerOver 而不是 Button 的按钮Background 属性值。

因此,您需要编写一个样式来更改内部 ContentPresenter,如下所示:

<Style Selector="Button.le:pointerover /template/ ContentPresenter#PART_ContentPresenter">
  <Setter Property="Background" Value="green" />
</Style>

不幸的是,这使您的样式依赖于主题,因为默认主题和流畅主题之间的控件模板不同。

,

Kekekeks 给出的答案是我提出的问题的正确答案。

然而,我使用这个空间是希望像我一样帮助完全没有 xaml 背景的 avalonia 新手用户。我们中的大多数人都希望 avalonia 为我们的应用程序提供一个可在 Windows/Mac/Linux 上运行的界面。老实说,在撰写本文时,c# 中还没有真正的替代品。

目前,Avalonia 确实有一些很好的示例和一些文档,但对于没有 xaml 背景的人来说并非如此。

因此,去 Udemy 或 LikedIn.Learning 或 Youtube 或任何你找到关于 WPF 的好课程的地方,然后去 Avalonia 的文档 并开始玩。

两者(Avalonia 和 WPF)的相似之处是巨大的!!! 是的,文档中多次提到它,但是直言不讳的“先去学习 WPF如果您是 xaml 的新手!”在文档的首页 可以为我节省相当多的时间,以便我尝试通过网站找到所有内容。

公平是公平的,该项目仍处于测试阶段,该阶段的网站已经有很好的文档记录,所以不要责怪团队!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?