在WPF中使用Controls.Popup作为错误装配器的问题

时间:2011-09-01 19:15:14

标签: wpf popup adorner

我的(简化)验证模板是

<Grid>
  <Border x:Name="ErrorAdorner" 
          BorderBrush="Red">
    <AdornedElementPalceHolder />
  </Border>
  <Popup x:Name="ErrorPopup"
         PalcementTarget="{Binding ElementName=ErrorAdorner}"
         Placement="Bottom"
         StaysOpen="false"
         IsOpen="true">
    <Grid>
      <TextBloxk Text="Error!!!" />
    </Grid>
  </Popup>
</Grid>

装饰元素通常是文本框

我使用这种方法的问题是,只要我在文本框内单击,ErrorPopup就会消失,并且ErrorAdorner仍然可见。期望的行为是两者都应该保持可见。

事情尝试了:

  1. 在ErrorPopup上将StaysOpen设置为true。问题:当错误可见时调整父窗口的大小/移动时,ErrorPopup保持在同一位置,它不随文本框一起移动
  2. 在文本框(装饰元素)和错误消息文本块周围使用StackPanel。问题:弹出窗口具有定位功能,即,如果装饰器的文本框下方没有足够的屏幕区域,则会自动重新定位。但是如果使用堆栈面板,如果没有空间或者更改文本框布局(不需要),错误消息就会中断
  3. 所以从本质上讲,我想使用弹出窗口来定位它的功能,但不知何故想要修复可见性问题

1 个答案:

答案 0 :(得分:0)

这里的问题是你可以调整窗口的大小,即使光标位于TextBox内部,你也无法获得任何有用的状态信息,所以如果你使IsOpen依赖于你,你仍然会脱臼弹出窗口。

可能this related question可以帮助您进行展示位置。