2015-10-01 38 views
1

我有一個UserControlStackPanel如何擴展從UserControl中父容器繼承的樣式?

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

UserControl包含具有通過ResourceDictionary設置自己的風格,實現了統一的外觀各地應用的各種TextBoxes和其他控制。
對於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)所有UserControlTextBox ES的應用默認的風格,所以我可以TextBox ES的IsReadOnly - 屬性綁定到只有在父母模型得到的屬性:

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

不幸的是,爲TargetType="{x:Type TextBox}"的默認樣式在UserControlResourceDictionary內定義的內容覆蓋了我嘗試在父項StackPanel中設置的樣式。

我怎樣才能實現對延長這是StackPanel.Resources內與在UserControl小號ResourceDictionary,而不是覆蓋它定義的默認樣式定義默認樣式?

回答

0

這是我做的,我從來沒有一個問題:

在資源字典:

<Style x:Key="TextBoxBase" TargetType="{x:Type TextBox}"> 
    <!-- Default styles go here --> 
</Style> 
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource TextBoxBase}"/> 

這確保除非另有說明,所有的文本框將有風格TextBoxBase並沒有什麼更多/更少。

當定義必須具有上述屬性,然後一些,你定義的風格樣式(在你的情況下,這種風格是StackPanel中的一部分)是這樣的:

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource TextBoxBase}"> 
    <Style.Triggers> 
     <!-- These triggers should be in ADDITION to triggers defined in TextBoxBase.--> 
     <DataTrigger Binding="{Binding Model.State}" Value="ReadOnly"> 
      <Setter Property="IsReadOnly" Value="True"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

另一個問題可能是事實,您定義了控件中包含的TextBoxes的樣式。如果您將樣式定向到的TextBox是唯一的控件,那麼爲什麼不在控件中定義它們呢?爲此,只需將控件上的ViewModel引用綁定到該控件上,然後使用該控件中的引用將DataTrigger應用於每個TextBox並使用上述方法。

+0

感謝您的文章,我最終爲UserControl的TextBoxes添加了一個額外的ContainerControl,並將它的IsReadOnly屬性綁定到我的ViewModelBase中可用的通用ReadOnly屬性。當我在半年前通過問題時,很遺憾,我無法立即測試您的解決方案,但會一直記住,只要我再次遇到問題,就試一試。 – M463