Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can XAML“;推演;从C#继承?_C#_Wpf_Xaml_Inheritance_Styles - Fatal编程技术网

Can XAML“;推演;从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

我想知道XAML是否能够“推断”C#继承。让我解释一下:

我有两个C#类:

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;
}