2017-02-18 61 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}} />