WPF:样式ContentControl

时间:2015-02-16 14:15:34

标签: c# wpf tooltip

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

我想重新创建的是这个(工具提示文字是蓝色'我'而不是'重新加载员工数据':

enter image description here

通过以下方式完成:

<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'而不是在对象的文本上创建一个新的堆栈面板。

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

    <!-- 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进行操作,我不会反对为每种控件类型创建单独的样式,但是希望避免重新定义整个模板。

1 个答案:

答案 0 :(得分:1)

你快到了。您需要为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>

无法做的是自动将自定义样式应用于所有“内容”控件:您将始终需要额外的ContentControl缠绕要以这种方式设置样式的每个元素。