如何将组合框的样式更改为WPF中的标签或超链接?

时间:2010-04-21 07:13:02

标签: wpf combobox wpf-controls controltemplate

我想将组合框控件的样式更改为超链接。

当用户点击超链接(组合框)时,它会在组合框中显示要选择的选项。

我的想法是我希望组合框控件显示为纯文本(更易读的形式)。

如果有人创造了这种风格,请告诉我。

1 个答案:

答案 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>

这个简化的代码显示了如何做到这一点。当然还有其他方法,它仍然需要一些工作,因为简化了示例。但是,我无法为您提供完整的代码。