验证模板中隐藏的AdornedElementPlaceholder

时间:2011-07-08 16:01:15

标签: c# wpf

亲爱的stackoverflow人员,为什么我的文本框,这是我的验证控件,隐藏在此模板中的DockPanel背后?

    <ControlTemplate x:Key="validationTemplate">
        <DockPanel Background="Black">
            <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
            <AdornedElementPlaceholder/>
        </DockPanel>
    </ControlTemplate>

如果背景设置为“透明”,则文本框可见,但我无法单击内部(光标不会更改)。

如何在不隐藏AdorendElementPlaceholder的情况下为我的模板设置背景?

谢谢gpx

1 个答案:

答案 0 :(得分:3)

装饰层确实位于元素的顶部,可以拦截鼠标交互。在您的情况下,通过将背景应用于DockPanel,您向WPF指示该对象具有“HitTestVisible”区域并将拦截鼠标单击。

另一个令人困惑的注意事项是“透明”仍然是HitTestVisible。如果您不希望它拦截鼠标点击,那么您应该将背景设置为“{x:Null}”或将其留空。

两个选项:

  1. 设置 Background =“{x:Null}”。这基本上没有背景,可以防止鼠标命中测试。
  2. 在DockPanel上指定 IsHitTestVisible =“False”。这将允许鼠标交互绕过该层并转到下一个可用层。
  3. 修改

    这是一个适用于KaXaml的示例。只需在文本框中键入“word”之类的内容即可生成验证错误。通过将背景颜色设置为半透明颜色,我可以看到文本框。设置IsHitTestVisible =“False”允许我用鼠标点击文本框。

    <Page
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <Page.Resources>
        <ControlTemplate x:Key="validationTemplate">
            <DockPanel Background="#5000" IsHitTestVisible="False">
                <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
                <AdornedElementPlaceholder/>
            </DockPanel>
        </ControlTemplate>
        <Style TargetType="TextBox" x:Key="validationStyle">
          <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="True">
              <Setter Property="Background" Value="Green" />
            </Trigger>
          </Style.Triggers>
        </Style>
      </Page.Resources>
      <StackPanel Name="grd" Width="100" Height="100">  
        <TextBox 
            VerticalAlignment="Top"
            Validation.ErrorTemplate="{StaticResource validationTemplate}"
            Text="{Binding ElementName=grd, Path=Width, Mode=TwoWay, ValidatesOnExceptions=True}" />
        <TextBox 
            VerticalAlignment="Top"
            Text="{Binding ElementName=grd, Path=Height, Mode=TwoWay, ValidatesOnExceptions=True}"
            Style="{StaticResource validationStyle}"
            >
        </TextBox>
      </StackPanel>
    </Page>