【问题标题】:ContenPresenter TextBlock style not working in Visual Studio ToolWindow ExtensibilityContenPresenter TextBlock 样式在 Visual Studio ToolWindow 可扩展性中不起作用
【发布时间】:2016-08-25 09:43:20
【问题描述】:

这很奇怪。 我创建了一个名为 Switch 的自定义控件。我还为 TextBlock 定义了一种样式。

<!-- Switch -->
<Style TargetType="{x:Type controls:Switch}">
    <Setter Property="Margin"
            Value="3,3,3,3" />
    <Setter Property="MinWidth"
            Value="40" />
    <Setter Property="MinHeight"
            Value="24" />
    <Setter Property="On"
            Value="ON" />
    <Setter Property="Off"
            Value="OFF" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls:Switch}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <ContentPresenter Grid.Column="0"
                                      Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Off}" />
                    <Border Grid.Column="1"
                            Background="{TemplateBinding Property=Background}"
                            BorderBrush="{TemplateBinding Property=BorderBrush}"
                            BorderThickness="{TemplateBinding Property=BorderThickness}"
                            CornerRadius="12,12,12,12"
                            HorizontalAlignment="Stretch"
                            VerticalAlignment="Center">
                        <Track x:Name="PART_Track"
                               Minimum="0"
                               Maximum="1" 
                               Orientation="Horizontal"
                               Value="0">
                            <Track.Thumb>
                                <Thumb x:Name="PART_Thumb"
                                       Style="{DynamicResource ResourceKey=SwitchThumb}" />
                            </Track.Thumb>
                        </Track>
                    </Border>
                    <ContentPresenter Grid.Column="2"
                                      Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=On}" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<!-- Text Block -->
<Style TargetType="{x:Type TextBlock}">
    <Setter Property="Margin"
            Value="3,3,3,3" />
    <Setter Property="HorizontalAlignment"
            Value="Left" />
    <Setter Property="VerticalAlignment"
            Value="Center" />
    <Setter Property="TextAlignment"
            Value="Left" />
    <Setter Property="TextWrapping"
            Value="Wrap" />
</Style>

当我将 Switch 实例(连同 TextBlock 样式)添加到简单窗口时,Switch 中使用的 ContentPresenter 将继承 TextBlock 样式。

但是当在 Visual Studio ToolWindow Extensibility 中使用 Switch 时,在 Switch 中使用的 ContentPresenter 不会继承 TextBlock 样式。

注意垂直对齐和边距,它们不是样式中设置的中心和 3,3,3,3。

知道为什么吗?

我尝试使用 snoop 来找出 ContentPresenter 中 TextBlock 的值,但它们与我定义的样式不符。

注意:我无法在所有 ContentPresenter 上设置 TextElement 附加属性,因为我有很多自定义控件,因此我更愿意为 TextBlock 设置样式。

【问题讨论】:

    标签: c# wpf controltemplate visual-studio-extensions vs-extensibility


    【解决方案1】:

    “为什么”的答案可能是:工具窗口中没有使用隐含的TextBox 样式。

    不过,我真的不在乎。如果我要设计这个开关的样式,我会说,好的,我希望Track 和标签之间有一点分离,并且我希望它们都垂直居中。这正是Switch 风格的内容。我不会依赖文本框来实现这一点。所以它会是这样的:

            <ControlTemplate TargetType="{x:Type controls:Switch}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <ContentPresenter Grid.Column="0"
                                      Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Off}" VerticalAlignment="Center"/>
                    <Border Grid.Column="1"
                            Background="{TemplateBinding Property=Background}"
                            BorderBrush="{TemplateBinding Property=BorderBrush}"
                            BorderThickness="{TemplateBinding Property=BorderThickness}"
                            CornerRadius="12,12,12,12"
                            HorizontalAlignment="Stretch"
                            VerticalAlignment="Center" Margin="3,0">
                        <Track x:Name="PART_Track"
                               Minimum="0"
                               Maximum="1" 
                               Orientation="Horizontal"
                               Value="0">
                            <Track.Thumb>
                                <Thumb x:Name="PART_Thumb"
                                       Style="{DynamicResource ResourceKey=SwitchThumb}" />
                            </Track.Thumb>
                        </Track>
                    </Border>
                    <ContentPresenter Grid.Column="2"
                                      Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=On}" VerticalAlignment="Center"/>
                </Grid>
            </ControlTemplate>
    

    【讨论】:

    • 1.感谢您的回答。 “工具窗口中未使用隐式文本框样式”是什么意思? 2. 就像我在帖子中提到的那样,我也在其他控件中使用该文本块样式。我不想到处设置对齐和边距。
    • 回答 #1:“Visual Studio ToolWindow 可扩展性”到底是什么意思,我似乎并没有真正明白这将是什么......到 #2 我确实在你的问题中读到了你不想那样做。但是说实话,你真的有多少款式,这会很麻烦。此外,在你的风格中定义它是要走的路。看看CheckBox's default style,看看ContentPresenter中的MarginVerticalAlignment
    • 另外,我不确定您是否将 DependencyProperties OnOff 设置为 objectstring 类型。如果是object,例如允许使用图标,那么您必须在图标中指定边距,否则图标将粘在顶部并且不会有轨道的默认边距。所以实际上边距和垂直对齐属于开关而不是开关的内容
    • 我正在使用 VS 可扩展性创建一个工具窗口,例如 Visual Studio 中的解决方案资源管理器。
    • 读起来非常有趣!不过,它确实支持我的论点。例如:如果您的主题用户使用了您没有特别设计的外部库(例如 Telerik)怎么办?然后他将不得不处理那里所有“TextBlocks”上添加的边距......不过,这并不重要,你自己找到了原因,并进一步讨论如何正确地做这件事主要是基于意见的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2023-03-29
    • 1970-01-01
    • 2023-01-13
    • 2019-04-04
    相关资源
    最近更新 更多