我想将组合框控件的样式更改为超链接。
当用户点击超链接(组合框)时,它会在组合框中显示要选择的选项。
我的想法是我希望组合框控件显示为纯文本(更易读的形式)。
如果有人创造了这种风格,请告诉我。
答案 0 :(得分:4)
您可以编辑ComboBox模板并使用超链接样式按钮替换ContentPresenter。这应该可以很好地工作,它只是一些XAML编码。您可以找到原始的ComboBox模板here,或使用Expression Blend。
修改强>
好吧,你有一个看起来像这样的ComboBox模板(非常简化!):
<ControlTemplate TargetType="{x:Type ComboBox}">
<Grid>
<!-- The popup that is displayed after you clicked on the ComboBox. -->
<Popup IsOpen="{TemplateBinding IsDropDownOpen}"
Placement="Bottom"/>
<!-- The button that is used to open the drop down. -->
<ToggleButton x:Name="btnOpenDropDown"
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"/>
<!-- The control which displays the currently selected item. -->
<ContentPresenter x:Name="contentPres"
Content="{TemplateBinding SelectionBoxItem}"/>
</Grid>
</ControlTemplate>
实际上,它有点复杂,因为ToggleButton必须占用整个宽度(因为只要你点击ComboBox就会打开下拉列表),但它应该显示仅在内容的右侧。但是,对于您的场景,我们可以忽略这一点,因为您没有下拉按钮。
现在,由于您只想将内容显示为超链接而除此之外没有按钮,因此您不再需要区分ContentPresenter和ToggleButton。因此,您可以使用ToggleButton来呈现内容,而不是使用单独的ContentPresenter,因为它还具有Content属性。这样的事情:
<ControlTemplate TargetType="{x:Type ComboBox}">
<Grid>
<!-- The popup that is displayed after you clicked on the ComboBox. -->
<Popup IsOpen="{TemplateBinding IsDropDownOpen}"
Placement="Bottom"/>
<!-- The button that is used to open the drop down AND to display the content (now). -->
<ToggleButton x:Name="btnOpenDropDown"
Content="{TemplateBinding SelectionBoxItem}"
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"/>
</Grid>
</ControlTemplate>
当然,还有一些其他属性可以从ContentPresenter移动到ToggleButton。
现在,您所要做的就是为ToggleButton定义另一个模板,它看起来像一个超链接(然后将此模板分配给上面的ToggleButton)。实际上,假设您的内容始终是一个字符串(再次简化!),这应该不难:
<Style x:Key="hyperlinkButtonStyle" TargetType="{x:Type ButtonBase}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<TextBlock Text="{TemplateBinding Content}"
TextDecorations="Underline"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这个简化的代码显示了如何做到这一点。当然还有其他方法,它仍然需要一些工作,因为简化了示例。但是,我无法为您提供完整的代码。