2017-02-18 25 views
0

如何將樣式應用於基於某個CustomControl的所有孩子。將樣式應用於從某個基類派生的控件

甲CustomControl

public class SubView : UserControl 
{ ... } 

基於所述CustomControl

public partial class MyView : SubView 
{ ... } 

XAML爲MyView的

<myLibrary:SubView 
    xmlns:myLibrary="...."> 

<Grid> 
    <!--Any content--> 
</Grid> 
</moduleChrome:SubView> 
的控制3210

(這個網格的孩子從代碼運行時設置)

<Grid> 
    <Grid.Resources> 
     <Style TargetType="myLibrary:SubView"> 
      <Setter Property="MyCustomDependancy" Value="{binding to a shared MyCustomDependancy}"/> 
     </Style> 
    </Grid.Resources> 

    <myLibrary:SubView/> <!--This will have the shared MyCustomDependancy--> 
    <localFolder:MyView/> <!--But this will not be affected--> 
</Grid> 

人會怎麼做才能讓MyView的由風格的影響?

編輯

這段代碼的由來是動態的,相當複雜,但我試圖讓問題儘可能通用,以便儘可能多的人可能可以通過一個可能的解決方案可以幫助,但我猜我說它太通用了。 我可能不會得到這些答案的幫助,但我希望別人會。

+0

你在找什麼,然後回答?爲什麼dont't創建好象真的自定義控件 – mm8

+0

@ mm8這是一個「真正的」自定義控件,SubView是另一個名爲View的自定義控件中用戶控件的替代品,這些View被託管在名爲「ViewHost」的「主」控件中。「視圖」和「子視圖」都有一個名爲ViewGate的依賴類(它允許視圖和主應用程序之間的通信)我想要做的就是將「視圖」的ViewGate綁定到其子視圖(子視圖)ViewGates因爲ViewGate具有動態屬性 – HGBRD

+0

那麼這與你最初的關於如何應用基類風格的問題有什麼關係呢? – mm8

回答

1

如預期前提是SubView真的是一個自定義的控制,而不是一個UserControl,並在主題定義/ Generic.xaml默認模板這將實際工作。

您可以使用以下示例代碼自行確認。

主題/ Generic.xaml:

<Style TargetType="local:SubView"> 
    <Setter Property="Opacity" Value="0.5" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:SubView}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> 
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

控制:

public class SubView : ContentControl 
{ 
    static SubView() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(SubView), 
      new FrameworkPropertyMetadata(typeof(SubView))); 
    } 
} 

public class MyView : SubView 
{ 

} 

用法:

<local:SubView> 
    <local:SubView.Content> 
     <TextBlock>content 1</TextBlock> 
    </local:SubView.Content> 
</local:SubView> 
<local:MyView> 
    <local:SubView.Content> 
     <TextBlock>content 2</TextBlock> 
    </local:SubView.Content> 
</local:MyView> 

從MSDN:「如果您確實需要創建新控件,最簡單的方法是創建一個從UserControl派生的類。這樣做之前,考慮你的控制將不支持模板,因此將不支持複雜的定製。」

https://msdn.microsoft.com/en-us/library/system.windows.controls.usercontrol(v=vs.110).aspx

1

樣式只適用於特定的類,它們不會被繼承。你可以這樣做,雖然:

<Style TargetType="{x:Type myLibrary:SubView}"> 
    <Setter Property="Opacity" Value="0.5"/> 
</Style> 
<Style TargetType="{x:Type localFolder:MyView}" BasedOn="{StaticResource {x:Type myLibrary:SubView}} /> 
相關問題