C# WPF按钮ContentTemplate在通过样式设置时被覆盖

C# WPF按钮ContentTemplate在通过样式设置时被覆盖,c#,wpf,C#,Wpf,如果我直接在Content Presenter上设置ContentTemplate,它工作正常,如果我使用Style它会被覆盖: <Style x:Key="MyContentStyle" TargetType="ContentPresenter"> <Setter Property="ContentTemplate" Value="{StaticResource Default}"/> </Style> <ControlTemplate x:

如果我直接在Content Presenter上设置
ContentTemplate
,它工作正常,如果我使用
Style
它会被覆盖:

<Style x:Key="MyContentStyle" TargetType="ContentPresenter">
    <Setter Property="ContentTemplate" Value="{StaticResource Default}"/>
</Style>

<ControlTemplate x:Key="ButtonTemplate" TargetType="Button">
    <Grid Margin="20">
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" 
                                      Style="{StaticResource MyContentStyle}"
                                      />
        </Border>
    </Grid>
</ControlTemplate>
</Grid.Resources>
<Button Template="{StaticResource ButtonTemplate}">Click Me</Button>
内部按钮
ControlTemplate

<ContentPresenter ContentTemplate="{StaticResource Default}"/>
<Style x:Key="MyContentStyle" TargetType="ContentPresenter">
    <Setter Property="ContentTemplate" Value="{StaticResource Default}"/>
</Style>

<ControlTemplate x:Key="ButtonTemplate" TargetType="Button">
    <Grid Margin="20">
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" 
                                      Style="{StaticResource MyContentStyle}"
                                      />
        </Border>
    </Grid>
</ControlTemplate>
</Grid.Resources>
<Button Template="{StaticResource ButtonTemplate}">Click Me</Button>
如果我独立于按钮使用
ContentPresenter
,它可以正常工作:

<DataTemplate x:Key="Default">
    <StackPanel>
        <TextBlock>this is the</TextBlock>
        <TextBlock>default view</TextBlock>
        <TextBlock Text="{Binding}"></TextBlock>
    </StackPanel>
</DataTemplate>

<ControlTemplate x:Key="ButtonTemplate" TargetType="Button">
    <Grid Margin="20">
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"
                                      ContentTemplate="{StaticResource Default}"
                                      />
        </Border>
    </Grid>
</ControlTemplate>
</Grid.Resources>
<Button Template="{StaticResource ButtonTemplate}">Click Me</Button>
<Style x:Key="MyContentStyle" TargetType="ContentPresenter">
    <Setter Property="ContentTemplate" Value="{StaticResource Default}"/>
</Style>

<ControlTemplate x:Key="ButtonTemplate" TargetType="Button">
    <Grid Margin="20">
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" 
                                      Style="{StaticResource MyContentStyle}"
                                      />
        </Border>
    </Grid>
</ControlTemplate>
</Grid.Resources>
<Button Template="{StaticResource ButtonTemplate}">Click Me</Button>
<Grid>
    <ContentPresenter Style="{StaticResource MyContentStyle}" Content="Work fine even with Style" />
</Grid>

按钮有自己的
内容模板
属性。直接设置此选项:

<Style x:Key="MyContentStyle" TargetType="ContentPresenter">
    <Setter Property="ContentTemplate" Value="{StaticResource Default}"/>
</Style>

<ControlTemplate x:Key="ButtonTemplate" TargetType="Button">
    <Grid Margin="20">
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" 
                                      Style="{StaticResource MyContentStyle}"
                                      />
        </Border>
    </Grid>
</ControlTemplate>
</Grid.Resources>
<Button Template="{StaticResource ButtonTemplate}">Click Me</Button>
<Button Template="{StaticResource ButtonTemplate}" ContentTemplate="{StaticResource Default}">Click Me</Button>

如果在ContentPresenter上设置了内容,则将应用样式。 因此,工作风格的解决方案是:

<Style x:Key="MyContentStyle" TargetType="ContentPresenter">
    <Setter Property="ContentTemplate" Value="{StaticResource Default}"/>
</Style>

<ControlTemplate x:Key="ButtonTemplate" TargetType="Button">
    <Grid Margin="20">
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" 
                                      Style="{StaticResource MyContentStyle}"
                                      />
        </Border>
    </Grid>
</ControlTemplate>
</Grid.Resources>
<Button Template="{StaticResource ButtonTemplate}">Click Me</Button>
<ContentPresenter Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}"  Style="{StaticResource MyContentStyle}" />


按钮是奇数。我自己也见过这种行为,都是因为优先权。ContentPresenter使用父级的DataTemplate属性作为自己的模板。ContentTemplate确实对我有帮助,因为我在ContentPresenter上使用style在具有数据触发器的不同ContentTemplates之间切换。现在我可以在ButtonStyle而不是MyContentStyle中为内容模板应用DataTrigger:)谢谢