#.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 говорит об этом намного лучше меня 😉 Не забудьте отметить свой ответ как разрешенный, если вы считаете, что на ваш вопрос был дан ответ