Can XAML“;推演;从C#继承?
我想知道XAML是否能够“推断”C#继承。让我解释一下: 我有两个C#类:Can XAML“;推演;从C#继承?,c#,wpf,xaml,inheritance,styles,C#,Wpf,Xaml,Inheritance,Styles,我想知道XAML是否能够“推断”C#继承。让我解释一下: 我有两个C#类: BStyleSelector继承自AStyleSelector,后者继承自StyleSelector。它们都实现了SelectStyle 然后在XAML文件中有下一个: 在这里,我定义了两种样式: <Style // to be used in both AStyleSelector and BStyleSelector x:Key="StyleA" //... some sty
BStyleSelector
继承自AStyleSelector
,后者继承自StyleSelector
。它们都实现了SelectStyle
然后在XAML文件中有下一个:
在这里,我定义了两种样式:
<Style // to be used in both AStyleSelector and BStyleSelector
x:Key="StyleA"
//... some styles
</Style>
<Style // to be used only in BStyleSelector
x:Key="StyleB"
//... some styles
</Style>
那么基类AStyleSelector
只定义一个属性aStyle
,该属性包含一个getter和一个setter,该getter和setter在派生类BStyleSelector
中继承。基类AStyleSelector
不会在其构造函数中为此属性指定值,因此当您创建它的新实例时,属性aStyle
将是默认值,null
。这同样适用于创建派生类的新实例BStyleSelector
<AStyleSelector aStyle="{StaticResource StyleA}" />
下面的XAML代码正是这样做的,它创建了一个新实例,其中属性aStyle
的值为null
,因为它在构造函数中没有分配任何其他值。构造之后,属性将通过其setter设置为静态资源StyleA
。请记住,它仅在AStyleSelector
的这个实例上设置
<AStyleSelector aStyle="{StaticResource StyleA}" />
因此,问题的解决方案是您已有的代码。您必须创建BStyleSelector
的实例,并显式分配aStyle
和StyleB
<BStyleSelector aStyle="{StaticResource StyleA}"
bStyle="{StaticResource StyleB}" />
继承并不意味着所有实例都具有相同属性的相同值。这没有道理。您必须在每个实例中初始化属性
<AStyleSelector aStyle="{StaticResource StyleA}" />
<BStyleSelector bStyle="{StaticResource StyleB}" />
<BStyleSelector aStyle="{StaticResource StyleA}"
bStyle="{StaticResource StyleB}" />
public override Style SelectStyle(object item, DependencyObject container)
{
var frameworkElement = (FrameworkElement)container;
var aStyle = (Style)frameworkElement.FindResource("StyleA");
return aStyle;
}