Как изменить стиль комбинированного списка на ярлык или гиперссылку в WPF? - PullRequest
4 голосов
/ 21 апреля 2010

Я хочу изменить стиль элемента управления поля со списком, чтобы он выглядел как гиперссылка.

Когда пользователь нажимает гиперссылку (поле со списком), в раскрывающемся списке отображаются параметры для выбора.

Идея заключается в том, что я хочу, чтобы элемент управления комбинированного окна отображался в виде простого текста (более читаемая форма).

Если кто-нибудь создал этот тип sytle, пожалуйста, дайте мне знать.

1 Ответ

4 голосов
/ 21 апреля 2010

Вы можете отредактировать шаблон ComboBox и заменить ContentPresenter кнопкой в ​​стиле гиперссылки. Это должно работать довольно хорошо, и это всего лишь код XAML. Вы можете найти оригинальный шаблон ComboBox здесь или использовать Expression Blend.

EDIT:
Хорошо, у вас есть шаблон 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. Поэтому вместо использования отдельного ContentPresenter вы можете использовать ToggleButton для представления контента, поскольку он также имеет свойство 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>

Этот упрощенный код показывает, как вы можете это сделать. Конечно, есть и другие способы, и это все еще требует некоторой работы для вас, поскольку пример был упрощен. Однако я не могу предложить вам полный код.

...