我想创建一个可应用于任何ContentControl的样式,该样式将采用工具提示并将图像添加到ContentControl并将工具提示文本从对象应用到图像。我有大约一百个需要完成(在各种项目中),因此能够创建一个样式将节省大量的打字。
我想重新创建的是这个(工具提示文字是蓝色'我'而不是'重新加载员工数据':
通过以下方式完成:
<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进行操作,我不会反对为每种控件类型创建单独的样式,但是希望避免重新定义整个模板。
答案 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
缠绕要以这种方式设置样式的每个元素。