Пользовательский ContentControl в WPF - PullRequest
8 голосов
/ 27 декабря 2010

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

Я пишу что-то вроде звукового редактора / организатора событий.У меня есть редактор треков, которым я довольно доволен.Тем не менее, я построил его в основном из пользовательских элементов управления (я знаю, это, вероятно, грех WPF).В соответствии с этой темой, я хочу сделать стандартный заголовок для треков, но я хочу, чтобы отдельные «типы» треков могли определять, что будет в этом заголовке.Я думал, что элемент управления, который определяет своего рода «захват» на краю, а затем позволяет исполнителю «заполнить» вещество, будет работать хорошо.Тем не менее, я понятия не имею, как сделать это в WPF без использования стилей, и даже если я в конечном итоге использую стили, я бы хотел это понять.

Это, вероятно, сводится к желанию чего-то вроде реализации примерапростое управление ContentControl (например, кнопка) и неспособность найти его (кроме AvalonDock, который в конечном итоге использует - правильно я уверен - шаблоны для этого).В моей голове xaml выглядит примерно так:

<ContentControl x:Class="TestArea.CustomContentControl2"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="Hello"/>
    <ContentPresenter Grid.Column="1"/>
</Grid>

Но, конечно, это не работает.Я вполне уверен, что смогу осуществить то же самое, сыграв за кулисами трюки с перегрузками, но было бы неплохо, если бы я мог сделать что-то подобное.Неужели я должен оставить все свои ужасные, процедурные пути позади и использовать эти стили, о которых вы говорите?Если да, может кто-нибудь хотя бы сказать мне, как выглядит эта кнопка в рамке?

Ответы [ 2 ]

4 голосов
/ 27 декабря 2010

Вот полный пример использования ContentControl для достижения желаемого: Создание настраиваемых пользовательских элементов управления (извлечение из ContentControl) в WPF 4

ContentPresenter Пита делает то же самое, что и в вашем примере.

1 голос
/ 27 декабря 2010

Использование стилей позволяет разделить функциональность элемента управления с представлением элемента управления;например, кнопка .

. С самого начала считайте управление не более чем функциональностью.Простой класс, содержащий предопределенные события, свойства и т. Д. Как только этот элемент управления становится частью визуального дерева, ему теперь требуется визуальная идентификация.Это не нужно раньше;Однако сейчас это так.Определение стиля по умолчанию позволяет этому элементу управления теперь иметь визуальное представление, в котором он ранее не нуждался, поскольку он не жил в визуальном дереве.

Игнорирование стилей было бы похоже на игнорирование CSS при использовании HTML.*

...