wpf – ItemsControl在显示弹出窗口后不会重新渲染

我在一个Window上有一个ItemsControl,其中一列包含一个简单的非常窄的StackPanel,它在某些情况下显示为Popup的目标.

在显示并且用户已被告知某事之后,用户通过按钮关闭该弹出窗口(绑定到该按钮的命令仅设置Popup.IsOpen绑定为false的视图模型的属性).

弹出窗口关闭,但其图像仍保留在ItemsControl上,直到滚动或其他窗口重叠为止.

Popup关闭后如何重新绘制ItemsControl?

码:

1)ItemsControl

<ScrollViewer ...>
  <ItemsControl x:Name="ux_List" ItemTemplate="{DynamicResource Lib_ItemTemplate}" ItemsSource="{Binding Path=TemplateInfos,Mode=OneWay}" AlternationCount="2" ... />

2)项目模板

<DataTemplate x:Key="Lib_ItemTemplate">
  <Grid x:Name="grid">
...
    <StackPanel Grid.Column="1">
       <Popup IsOpen="{Binding Path=HasError,Mode=OneWay}">
          <ContentPresenter Content="{Binding Path=ErrorContext, Mode=OneWay}"

在上面的代码片段的最后一行中,演示者内部有一个关闭按钮:

<Button ... Command="{TemplateBinding CloseButtonCommand}" />

命令绑定到此按钮,如下所示:

private void OnCloseErrorMessageCommand()
{
    HasError = false;
    ...
}

最佳答案 这是我的工作场所:

在Control的父窗口中:

    public IntPtr Hwnd { get; set; }
    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);
        IntPtr hwnd = new WindowInteropHelper(this).Handle;
        this.Hwnd = hwnd;
    }

    public void Refresh()
    {
        if (Hwnd == IntPtr.Zero)
            throw new InvalidOperationException("Hwnd");
        InvalidateRect(this.Hwnd, IntPtr.Zero, true);
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    public static extern bool InvalidateRect(IntPtr hWnd, IntPtr rect, bool erase);

Popup关闭后,调用Refresh()方法.

点赞