如何扩展从UserControl中的父容器继承的样式?

时间:2015-10-01 16:34:18

标签: c# wpf xaml user-controls

我的StackPanel里面有一个UserControl

<StackPanel>
    <local:MyUC/>
</StackPanel>

UserControl包含各种TextBoxes以及通过ResourceDictionary设置其样式的其他控件,以实现整个应用程序的通用外观。
对于TextBox es,ResourceDictionary条目如下所示:

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="DockPanel.Dock" Value="Top"/>
    <Setter Property="TextWrapping" Value="Wrap"/>
    <Setter Property="MaxWidth" Value="{Binding RelativeSource={RelativeSource AncestorType=Border},Path=ActualWidth}"/>
    <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
</Style>

现在我想将父控件中的默认样式(StackPanel)应用于TextBox内的所有UserControl es,这样我就可以绑定{{1 - IsReadOnly es的属性,该属性仅在父模型中可用:

TextBox

不幸的是,在<StackPanel> <StackPanel.Resources> <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> <Style.Triggers> <DataTrigger Binding="{Binding Model.State}" Value="ReadOnly"> <Setter Property="IsReadOnly" Value="True"/> </DataTrigger> </Style.Triggers> </Style> </StackPanel.Resources> <local:MyUC/> </StackPanel> 的{​​{1}}内定义的TargetType="{x:Type TextBox}"的默认样式会覆盖我尝试在父ResourceDictionary中设置的样式}。

如何使用UserControl StackPanel中定义的默认样式来扩展StackPanel.Resources内定义的默认样式,而不是覆盖它?

1 个答案:

答案 0 :(得分:0)

这就是我的工作,我从来没有遇到过问题:

在ResourceDictionary中:

void changeToAsterisk(int chartNumber) {
  printf ("1.  %d|", chartNumber);
  for (int i = 0; i < chartNumber; i++)
    {
     printf("*");
    }
}

这确保除非另有说明,否则所有TextBox都将具有样式<Style x:Key="TextBoxBase" TargetType="{x:Type TextBox}"> <!-- Default styles go here --> </Style> <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource TextBoxBase}"/> ,而不会更多/更少。

在定义必须具有上述属性的样式然后定义某些样式时,您可以定义样式(在您的情况下,此样式是StackPanel的一部分),如下所示:

TextBoxBase

另一个问题可能是您为控件中包含的TextBoxes定义样式。如果您使用的样式的文本框是唯一包含它们的控件,为什么不在控件本身中定义它们?为此,您只需在控件上绑定对ViewModel的引用,然后在控件中使用该引用,使用上述方法将DataTrigger应用于每个TextBox。