WPF:隐形控制(?)

时间:2011-04-13 14:36:32

标签: .net wpf wpf-controls

我尝试理解,为什么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>

指示控件的任何存在 - 未检测到任何边框,任何工具提示,任何背景。

为什么会这样,以及如何使控件可见?

3 个答案:

答案 0 :(得分:4)

Control类是可以模板化的控件的基类,但它不定义模板本身。没有模板的控件没有可视化树,因此它不显示。

答案 1 :(得分:2)

我认为在XAML中对这样的控件进行声明并不意味着什么,因为它本身并不代表视觉效果。

您需要为该控件和内部控件定义模板,使用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>

答案 2 :(得分:0)

MSDN:

找到一些解释

在您的应用程序中看不到没有Control的{​​{1}},除非ControlTemplate明确引用它们,否则设置以下属性无效:

  • 背景
  • BorderBrush
  • 了borderThickness
  • 的FontFamily
  • 字号
  • FontStretch
  • fontWeight设置
  • 前景
  • Horizo​​ntalContentAlignment
  • VerticalContentAlignment

使用这些属性的常用方法是将ControlTemplate中的元素绑定到属性。例如,如果希望控件根据Background属性的值更改颜色,则可以将ControlTemplate中元素的某些属性绑定到Background。使用TemplateBinding标记扩展将控件上的属性绑定到ControlTemplate中的元素。