【问题标题】:How Do I Correctly Apply a Style to Content Presenter如何正确地将样式应用于 Content Presenter
【发布时间】:2012-11-29 14:37:30
【问题描述】:

我正在处理这个关于链接按钮的问题的答案:

https://stackoverflow.com/a/3564706/945

问题在于 TextDecoration 下划线样式仅应用于自动生成的 TextBlocks。

<Button Style="{StaticResource LinkButton}">Text</Button> 

“文本”带有下划线

<Button Style="{StaticResource LinkButton}"><TextBlock Text='Text' /></Button> 

“文本”没有下划线

为什么它不适用于内容中的任何 TextBlock?

这是样式的相关部分:

<Style x:Key="LinkButton" 
       TargetType="Button"
       BasedOn="{StaticResource ResourceKey={x:Type Button}}"
       >

    <Setter Property="Width" Value="Auto"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <ContentPresenter Content="{TemplateBinding Content}" 
                                  ContentTemplate="{TemplateBinding  ContentTemplate}"
                                  VerticalAlignment="Center"
                                  >
                    <ContentPresenter.Resources>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="TextDecorations" Value="Underline" />
                        </Style>
                    </ContentPresenter.Resources>
                </ContentPresenter>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【问题讨论】:

  • 为什么要在 Button 中放置 TextBlock? Button 类有自己的内置“内容”字段,可以很好地格式化和缩放——您也可以在 Blend 中轻松编辑它的方式。 &lt;Button Style="{StaticResource LinkButton}" Content="Text" /&gt;

标签: wpf styles


【解决方案1】:

我相信当您将框架元素放入 ContentControl 时,不会应用模板。如果您还将 TextBlock 样式声明为 Button 的资源,则它在这两种情况下都有效。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:local="clr-namespace:WpfApplication1"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="525"
    Height="350"
    mc:Ignorable="d">
<Window.Resources>
    <Style x:Key="LinkButton"
           BasedOn="{StaticResource ResourceKey={x:Type Button}}"
           TargetType="Button">

        <Setter Property="Width" Value="Auto" />

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <ContentPresenter VerticalAlignment="Center"
                                      Content="{TemplateBinding Content}"
                                      ContentTemplate="{TemplateBinding ContentTemplate}" >
                        <ContentPresenter.Resources>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="TextDecorations" Value="Underline" />
                            </Style>
                        </ContentPresenter.Resources>
                    </ContentPresenter>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Window.DataContext>
    <local:ViewModel />
</Window.DataContext>
<Grid x:Name="LayoutRoot">
    <StackPanel>
        <Button Style="{StaticResource LinkButton}">Text</Button>
        <Button Style="{StaticResource LinkButton}">
            <Button.Resources>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="TextDecorations" Value="Underline" />
                </Style>
            </Button.Resources>
            <TextBlock Text="Text" />
        </Button>
    </StackPanel>
</Grid>
</Window>

【讨论】:

  • 但重点是定义一个单一的“LinkBut​​ton”样式一次。不要将自定义样式应用于应用程序中的每个链接按钮
  • 您可以在您的控件资源中定义完整的样式(或者选择Button的资源中的样式作为主体)并在ContententPresenter中根据主体定义样式作为占位符。
【解决方案2】:

我昨天遇到了类似的麻烦。您可以将文本块的样式设置器向上移出模板节点,这样您的样式就不会在您更改控件内容后被删除。

【讨论】:

    【解决方案3】:

    问题是你设置了x:Key="LinkButton"。如果您设置密钥,则隐式样式将不起作用。删除密钥,它将应用于所有按钮

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 2020-12-10
      • 2019-09-23
      相关资源
      最近更新 更多