代码之家  ›  专栏  ›  技术社区  ›  user007

wpf按钮contenttemplate在通过样式设置时被重写

  •  0
  • user007  · 技术社区  · 6 年前

    如果我设置 ContentTemplate 如果我使用 Style 它被重写:

    内部按钮 ControlTemplate :

    <ContentPresenter ContentTemplate="{StaticResource Default}"/>
    

    VS

    <ContentPresenter Style="{StaticResource MyContentStyle}"/>
    

    工作精细:

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

    违约 DataTemplate 不应用,它表示在可视化树中重写。 这就是 默认视图

    <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 与Button无关,它工作正常:

    <Grid>
        <ContentPresenter Style="{StaticResource MyContentStyle}" Content="Work fine even with Style" />
    </Grid>
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   mm8    6 年前

    这个 Button 有它自己的 ContentTemplate 财产。直接设置此选项:

    <Button Template="{StaticResource ButtonTemplate}" ContentTemplate="{StaticResource Default}">Click Me</Button>
    

    或在 Style 你申请的 纽扣 :

    <Style x:Key="ButtonStyle" TargetType="Button" >
        <Setter Property="ContentTemplate" Value="{StaticResource Default}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid Margin="20">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"  />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    ...
    <Button Style="{StaticResource ButtonStyle}">Click Me</Button>
    
        2
  •  0
  •   user007    6 年前

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

    <ContentPresenter Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}"  Style="{StaticResource MyContentStyle}" />