2013-10-10 32 views
1

在当前窗口中,我有一个带有多个控件(标签,文本框,按钮)的网格。 一般样式在App.xaml中设置。网格资源中设置了每个控件的扩展。 每个控件的可见性由viewmodel属性值决定。不要将每个控件的可见性绑定到它(它使用自定义转换器,这会导致很多重复)我希望有“MyVisible1”风格。如何使样式扩展但不覆盖其他样式

问题是如果我应用这种风格它重叠其他属性。我应该在“BasedOn”中使用什么值?或者我还能做些什么来实现它?

<Grid> 
    <Grid.Resources> 
     <Style TargetType="{x:Type Control}" x:Key="MyVisible1"> 
      <Setter Property="Visibility" Value="{Binding ...}" /> 
     </Style> 

     <Style TargetType="Label" BasedOn="{StaticResource {x:Type Label}}"> 
      <Setter Property="HorizontalAlignment" Value="Right" /> 
     </Style> 
     <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}"> 
      <Setter Property="Width" Value="80" /> 
      <Setter Property="HorizontalAlignment" Value="Left" /> 
     </Style> 
     <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}"> 
      <Setter Property="Width" Value="45" /> 
      <Setter Property="HorizontalAlignment" Value="Right" /> 
     </Style> 
    </Grid.Resources> 

    <TextBox Grid.Column="0" Grid.Row="0" Style="{StaticResource MyVisible1}"/> 
</Grid> 

回答

0

,我可以想像,你可以做到这一点的唯一方法是定义这个地方隐Style

<Style TargetType="{x:Type Control}"> 
    <Setter Property="Visibility" Value="{Binding ...}" /> 
</Style> 

通过定义x:Key,这Style将被隐式应用扩展到Control类的所有控件,并通过在本地声明它,它将只应用于当前焦点范围中的那些元素。因此,将其定义在Grid.Resources部分将隐式应用于该Grid内的所有控件。然后,您可以自由地将任何其他Style应用于这些控件。

+0

我将拥有多种可见性样式。在这种情况下,你的建议并没有帮助。 ( – Julia

+0

当我第一次开始编写WPF时,我总是在各种'Style',ControlTemplate','DataTemplate'等中得到大量重复的代码。我花了很多年试图找到复制更少代码的方法并找到通常是不可能的,然后我意识到WPF与其他语言相比是一种相当冗长的语言,如果我们复制几个字节甚至千字节的代码,那真的没有关系。 – Sheridan