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
环绕您想要以这种方式设置样式的每个元素。
我想创建一个可以应用于任何 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
环绕您想要以这种方式设置样式的每个元素。