Avalonia 样式选择器不适用于派生 类

Avalonia style selector doen't works on derived classes

我在设置派生自按钮的自定义控件的样式时遇到问题。

我继承了 Button class 并为其添加了一个 DependencyProperty:

public class IconButton : Button, IStyleable
{
    Type IStyleable.StyleKey => typeof(Button);

    public static readonly StyledProperty<string> IconProperty =
        AvaloniaProperty.Register<IconButton, string>(nameof(Icon));

    public string Icon
    {
        get { return GetValue(IconProperty); }
        set { SetValue(IconProperty, value); }
    }
}

现在我想创建一个仅针对此派生的样式 class:

<Styles xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="clr-namespace:Projektanker.Icons.Avalonia;assembly=Projektanker.Icons.Avalonia"
        xmlns:cc="*****.*****.CustomControls">
    <Design.PreviewWith>
        <Border Padding="20">
          <StackPanel Orientation="Vertical">
            <cc:IconButton Content="hello custom" Icon="fab fa-github"/>
            <Button Content="hello"/>
          </StackPanel>
        </Border>
    </Design.PreviewWith>

  <Style Selector=":is(cc|IconButton)">
    <Setter Property="Background" Value="Red"/>
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate>
          <StackPanel Orientation="Horizontal">
            <i:Icon Value="{TemplateBinding Icon}" />
            <TextBlock Text="{TemplateBinding Content}" />
          </StackPanel>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
</Styles>

如您所见,内容不是我的控件模板,因为图标不可见且背景不是红色。因此我不能使用我的依赖属性。

有什么建议或语言不支持吗? 我阅读了选择器的 (****) 文档,旨在支持派生类型,因此我希望我的代码能够正常工作:(

谢谢帮助。

尝试删除 IStyleable 和您覆盖的 StyleKey。您告诉选择器它应该查找 Button 样式而不是您的样式。

快乐编码 蒂姆

PS我现在无法自行测试,所以如果它不起作用请在这里告诉我。


更新:我刚刚创建了一个空白的新项目并测试了您的代码。一旦我删除了 StyleKey,它就起作用了:

这是修改后的 IconButton:

public class IconButton : Button
{
    public static readonly StyledProperty<string> IconProperty =
        AvaloniaProperty.Register<IconButton, string>(nameof(Icon));
    
    public string Icon
    {
        get { return GetValue(IconProperty); }
        set { SetValue(IconProperty, value); }
    }
}

如果你能在 Github 上上传一个最小的样本,我可以看看有什么问题。


更新 2:查看您的演示应用程序,我发现您使用了第三方图标库。该库需要你在启动时配置一个特殊的服务,见:https://github.com/Projektanker/Icons.Avalonia#1-register-icon-providers-on-app-start-up

我给你发了一个 PR 来解决你的问题。

快乐编码 蒂姆