我的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
内定义的默认样式,而不是覆盖它?
答案 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。