WPF:样式化 ContentControl

WPF: Styling ContentControl

我想创建一个可以应用于任何 ContentControl 的样式,它会采用 ToolTip 并将图像添加到 ContentControl 并将工具提示文本从对象应用到图像。我有大约 100 个需要完成(在各种项目中),因此能够创建样式将节省大量输入。

我要重新创建的是这个(工具提示文本在蓝色 'i' 而不是 'Reload Employee Data':

这是通过以下方式完成的:

<StackPanel Orientation="Horizontal">
    <CheckBox Content="Reload Employee Data"
              IsChecked="{Binding AdjustmentSettings.ReloadEmployeeData}" 
              Grid.Row="0"
              Grid.Column="0">
    </CheckBox>
    <Image Source="/DelphiaLibrary;Component/Resources/info.ico" 
           ToolTip="Check if you want to re-upload ..."/>
</StackPanel>

我试图避免的是每次我想在 'i' 而不是对象文本上添加带有工具提示文本的蓝色 'i' 时创建一个新的堆栈面板.

我能够创建适用于标签的以下内容:

    <!-- Works for just Label -->
    <Style x:Key="LabelToolTipStyle"
           TargetType="{x:Type Label}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Label">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{TemplateBinding Content}" />
                        <Image Source="info.ico" ToolTip="{TemplateBinding ToolTip}"/>
                    </StackPanel>

                </ControlTemplate>                    
            </Setter.Value>
        </Setter>
    </Style>

我可以简单地通过将样式添加到标签来调用它,如下所示:

<Label Content="First Text" Style="{StaticResource LabelToolTipStyle}" ToolTip="Label with LabelToolTipStyle" />

然后我尝试通过创建一个针对 ContentControl 的样式来使它更通用,但显然不起作用,因为这会覆盖整个模板(在 CheckBox 控件的情况下,复选框丢失):

    <!-- Works on Label but not CheckBox -->
    <Style x:Key="ContentToolTipStyle"
           TargetType="{x:Type ContentControl}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ContentControl">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{TemplateBinding Content}" />
                        <Image Source="info.ico" ToolTip="{TemplateBinding ToolTip}"/>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

有没有一种方法可以让我为 ContentControls 创建一个样式,这样我就可以在不重新定义整个模板的情况下添加到模板中?如果不能对 ContentControl 完成,我不会反对为每种控件类型创建单独的样式,但希望避免为此重新定义整个模板。

你快到了。您需要为 ContentControl:

创建自定义控件模板
<Style x:Key="ToolTipWrapper" TargetType="{x:Type ContentControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ContentControl}">
                <StackPanel Orientation="Horizontal">
                    <StackPanel.ToolTip>
                        <ToolTip Visibility="Hidden" />
                    </StackPanel.ToolTip>
                    <ContentPresenter />
                    <Image Source="info.ico" ToolTip="{TemplateBinding ToolTip}" />
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后将您的元素包裹在 ContentControl 中并应用样式:

<ContentControl Style="{StaticResource ToolTipWrapper}" ToolTip="Hello world">
    <CheckBox Content="I am a check box" />
</ContentControl>

不能做的是自动将自定义样式应用到所有 "content"控件:你将永远需要额外的 ContentControl 环绕您想要以这种方式设置样式的每个元素。