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 来解决你的问题。
快乐编码
蒂姆
我在设置派生自按钮的自定义控件的样式时遇到问题。
我继承了 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 来解决你的问题。
快乐编码 蒂姆