WPF: невидимый элемент управления (?)

#.net #wpf #wpf-controls

#.net #wpf #wpf-элементы управления

Вопрос:

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

Допустим, мы имеем следующее:

 <Window x:Class="WpfApplication13.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication13"
        Title="MainWindow" Height="350" Width="525">

    <DockPanel Name="dockPanel1" Background="LightBlue">

        <Canvas DockPanel.Dock="Left" ToolTip="tt one" Width="200" Background="Blue">
            <Control Background="Red" ToolTip="tt control" BorderBrush="Red" BorderThickness="5" Width="50" Height="100"></Control>
        </Canvas>

        <Button Content="two" DockPanel.Dock="Left" ToolTip="tt two" ></Button>
        <!--<my:MyControl Background="Red" ToolTip="tt hello" BorderBrush="Red" BorderThickness="5"></my:MyControl>-->

        <Control Background="Red" ToolTip="tt hello" BorderBrush="Red" BorderThickness="5"></Control>
    </DockPanel>
</Window>
  

Не обнаружено никакого присутствия указанных элементов управления — ни границы, ни всплывающей подсказки, ни фона.

Почему это и как сделать элементы управления видимыми?

Ответ №1:

Control Класс является базовым классом для элементов управления, которые могут быть шаблонизированы, но он не определяет сам шаблон. А элемент управления без шаблона не имеет визуального дерева, поэтому он не отображается.

Ответ №2:

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

Вам нужно определить шаблон для этого элемента управления, а для элементов управления внутри связать их свойство с помощью TemplateBinding.

что-то вроде этого :

         <Canvas DockPanel.Dock="Left" ToolTip="tt one" Width="200" Background="Blue">
        <Control Background="Red" ToolTip="tt control" BorderBrush="Red" BorderThickness="5" Width="50" Height="100">
            <Control.Template>
                <ControlTemplate>
                    <TextBlock Text="Hello" Background="{TemplateBinding Background}"/>
                </ControlTemplate>
            </Control.Template>
        </Control>
    </Canvas>
  

Ответ №3:

Нашел некоторое объяснение в MSDN:

Элемент, Control у которого нет ControlTemplate , не отображается в вашем приложении, и установка следующих свойств не имеет эффекта, если ControlTemplate на них явно не ссылается:

  • Предыстория
  • BorderBrush
  • Толщина границ
  • Семейство шрифтов
  • Размер шрифта
  • Растяжение шрифта
  • Вес шрифта
  • Передний план
  • Выравнивание по горизонтали
  • Выравнивание по вертикали

Распространенный способ использования этих свойств — привязать элемент в ControlTemplate к свойству. Например, если вы хотите, чтобы ваш элемент управления менял цвет в соответствии со значением свойства Background, вы можете привязать какое-либо свойство элемента в ControlTemplate к Background . Используйте расширение разметки TemplateBinding для привязки свойств элемента управления к элементу в ControlTemplate.

Комментарии:

1. Да 🙂 MSDN говорит об этом намного лучше меня 😉 Не забудьте отметить свой ответ как разрешенный, если вы считаете, что на ваш вопрос был дан ответ