Пользовательский элемент управления WPF, расширяющий класс границы. «Не поддерживает прямой контент»? - PullRequest
2 голосов
/ 17 марта 2011

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

Process Mimic

Я создал тестовый проект с пользовательским элементом управления и добавил ListBox (для всплывающих подсказок) и элемент ContentPresenter, обернутый в пограничный элемент управления. Однако всякий раз, когда я использую этот новый элемент управления в другом приложении, он не позволяет мне добавлять к нему контент. Я пытался связать некоторые с ContentPropertyAttribute и свойствами элемента ContentPresenter, но я чувствую, что здесь я в тупике.

<UserControl x:Class="SystemStatusBorder.UserControl1"
             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">
    <Canvas Height="290" Width="303">        
        <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <ContentPresenter/>
        </Border>
        <ListBox Canvas.Right="0" Canvas.Bottom="0">
            <ListBox.RenderTransform>
                <TranslateTransform X="20"></TranslateTransform>
            </ListBox.RenderTransform>
            <ListBoxItem>TagA</ListBoxItem>
            <ListBoxItem>TagB</ListBoxItem>
        </ListBox>
    </Canvas>
</UserControl>

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

<SystemBorder>
  <SystemBorder.MonitoredTags>
        <List of relevant tags for the specific sub system goes here>
  </SystemBorder.MonitoredTags>
  <regular content goes here>  
</SystemBorder>

1 Ответ

4 голосов
/ 17 марта 2011

Чтобы создать собственный контейнерный элемент управления, вы должны создать новый пользовательский элемент управления (не UserControl).

Сделать свой новый элемент управления наследуемым от ContentControl.

У пользовательских элементов управления нет своихсобственный XAML.Вместо этого им присваивается ControlTemplate.

При создании первого пользовательского элемента управления в среде IDE создается новый файл Themes \ Generic.xaml.

. Здесь находится шаблон для вашего элемента управления.,Вы можете изменить этот шаблон, чтобы он соответствовал XAML в вашем вопросе.Это поддержит элемент ContentPresenter.

Я нашел очень хорошее прохождение здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...