将Style应用于从某个基类派生的控件

时间:2017-02-18 21:09:11

标签: c# wpf xaml custom-controls

如何将样式应用于基于特定CustomControl的所有子项。

示例

CustomControl

public class SubView : UserControl
{ ... }

基于CustomControl的控件

public partial class MyView : SubView
{ ... }

MyView的XAML

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

<Grid>
    <!--Any content-->
</Grid>
</moduleChrome:SubView>

(此网格的子项是从代码运行时设置的)

<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受到样式的影响?

修改

这段代码的来源是动态的,相当复杂,但我试图让问题尽可能通用,以便尽可能多的人可以通过一个可能的解决方案来帮助,但我想我太过通用了。 我可能不会得到这些答案的帮助,但我希望其他人会这样做。

2 个答案:

答案 0 :(得分: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}} />

答案 1 :(得分:1)

如果SubView确实是自定义控件而不是UserControl并且在Themes / 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