2013-10-10 38 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