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

发布于 2024-12-02 13:18:16 字数 879 浏览 4 评论 0原文

我的(简化的)验证模板是

<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。问题:弹出窗口具有定位功能,即,如果文本框下方没有足够的屏幕区域用于装饰器,它会自动重新定位它。但是如果使用堆栈面板,如果没有空间或者它更改了文本框布局(不需要),错误消息就会被切断

所以本质上,我想使用弹出窗口的位置功能,但以某种方式想要修复可见性问题

My (simplified) validation template is

<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>

The adorned element is typically a textbox

The problem I have with this approach is that, as soon as I click inside the textbox, the ErrorPopup disappears and the ErrorAdorner remains visible. Desired behavior is that both should stay visible.

Things tried:

  1. Set StaysOpen to true on ErrorPopup. Problem: when you resize/move the parent window when the error is visible, the ErrorPopup remains at the same location, it doesnt move along with the textbox
  2. Use a StackPanel around the textbox (adorned element) and the error message text block. Problem: Popup comes with positioning capabilities ie., if there is not enough screen area below the textbox for the adorner, it automatically relocates it. But if a stack panel is used, error message just cuts off if there is no space or it changes the textbox layout(not desired)

So in essence, I want to use the popup for its positional capabilities, but somehow want to fix the visibility problem

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

对岸观火 2024-12-09 13:18:16

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

可能此相关问题可以帮助您进行展示位置。

The problem here is that you can resize the window even if the cursor is inside the TextBox, you cannot get any useful state information out of that, so if you make the IsOpen dependent on that you still get dislocated popups.

Possibly this related question can help you with the placement.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文