C# WPF-只能基于目标类型为基类型的样式

C# WPF-只能基于目标类型为基类型的样式,c#,wpf,xaml,C#,Wpf,Xaml,这让我发疯,主要是因为在运行时它工作得非常完美(这个问题只出现在设计时),但我还是决定问一下,因为我正在处理一个大项目,我想以最好的方式实现它 第一件事:我有一个来自第三方库的组件,它基本上像一个边框,它是这样定义的(使用F12): 我喜欢这个东西的视觉效果,但我需要添加一些功能。因此,我创建了一个新的自定义控件: public class SelectableCard : AdvancedBorder { // bunch of custom properties and stuff

这让我发疯,主要是因为在运行时它工作得非常完美(这个问题只出现在设计时),但我还是决定问一下,因为我正在处理一个大项目,我想以最好的方式实现它

第一件事:我有一个来自第三方库的组件,它基本上像一个边框,它是这样定义的(使用F12):

我喜欢这个东西的视觉效果,但我需要添加一些功能。因此,我创建了一个新的自定义控件:

public class SelectableCard : AdvancedBorder
{
    // bunch of custom properties and stuff

    static SelectableCard()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(SelectableCard), new FrameworkPropertyMetadata(typeof(SelectableCard)));
    }
}
最后,我需要保持完全相同的视觉效果,但添加一些触发器,因此我将其放在generic.xaml中:

<Style TargetType="{x:Type customControls:SelectableCard}" BasedOn="{StaticResource ResourceKey={x:Type otherLibrary:AdvancedBorder}}">
    <Setter Property="HorizontalAlignment" Value="Stretch"/>
    <Setter Property="VerticalAlignment" Value="Stretch"/>
    <Style.Triggers>
        <Trigger Property="customControls:SelectableCard.IsSelected" Value="True">
            <Setter Property="Background" Value="{DynamicResource MyLightBrush}" />
        </Trigger>
    </Style.Triggers>
</Style>

customControls
是我的命名空间的xmlns,
otherLibrary
是第三方库的xmlns

在运行时,一切都运行得非常好,并且完全没有错误。在设计时,我没有从generic.xaml中得到任何错误,但一旦我将SelectableCard放入某个xaml文件中,我就得到了

只能基于目标类型为基本类型的样式 可选择卡

我一点也不明白,尤其是当它在运行时工作时。我可以删除
BasedOn
属性,并且在设计时不会再收到投诉,但是我必须为模板添加setter,否则我在运行时看不到任何东西


这里我做错了什么?

我从来没有想过这一点,但是您是否尝试将名称空间引用放在外部xaml文件中?这会改变什么吗?一般来说,将任何事情归咎于VisualStudio中的bug都是错误的,但每件事都有例外,而且XAML设计器有时有点滑稽。通常是无害的。@EdPlunkett我从不认为这是一个VStudio错误,除非我正在与WPF设计器合作:-D但即使在这种情况下,99%的时间我都能找到解决问题的方法,并发现这是我的错误。在这种情况下,我已经知道,如果我删除BasedOn并为Template属性添加setter,一切都会正常工作,这就是我试图了解自己是否做错了什么的原因。正如您所看到的,代码编译和运行良好。我同意@Ed的评论,这是XAML编辑器完全错误的不幸案例之一。注意,编辑器实际上并没有运行XAML编译器来生成这些类型的消息;它实际上拥有自己的XAML编译器内置副本,而且该编译器并不是完全没有bug的(何时,何时!我们会得到相当于Roslyn的XAML编译器…叹气)。根据我的经验,有时您可以更改声明,使其仍能正常工作,但XAML编辑器不会抱怨(但在这个例子中,我没有具体的建议)。在其他情况下,你只需要咧嘴一笑,忍受它(
<Style TargetType="{x:Type customControls:SelectableCard}" BasedOn="{StaticResource ResourceKey={x:Type otherLibrary:AdvancedBorder}}">
    <Setter Property="HorizontalAlignment" Value="Stretch"/>
    <Setter Property="VerticalAlignment" Value="Stretch"/>
    <Style.Triggers>
        <Trigger Property="customControls:SelectableCard.IsSelected" Value="True">
            <Setter Property="Background" Value="{DynamicResource MyLightBrush}" />
        </Trigger>
    </Style.Triggers>
</Style>