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

时间:2012-01-31 14:05:23

标签: wpf itemscontrol

我在一个窗口上有一个 ItemsControl ,其中一列包含一个简单的非常窄的StackPanel,它作为弹出窗口的目标,在某些窗口中显示情况。

在显示并且用户已被告知某事后,用户通过按钮关闭此弹出(绑定到此按钮的命令只是将视图模型的属性设置为哪个 Popup.IsOpen 绑定到 false )。

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

弹出窗口关闭后如何重绘 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;
    ...
}

3 个答案:

答案 0 :(得分:2)

这是我的工作场所:

在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()方法。

答案 1 :(得分:0)

当弹出窗口关闭时,如果设置Visibility = Collapsed会发生什么?似乎这样就可以完全从视图中删除它。

否则我知道无法重新呈现单个项目,而ItemsControl.Refresh方法将重新加载所有项目(通常会导致显示愚蠢(项目消失并重新出现,动画重置等)。

答案 2 :(得分:0)

在Popup关闭后,很难猜出是什么阻止了您的ItemsControl重绘。这通常不会发生。

您可以随时做的一件事就是在ItemsControl上调用InvalidateVisualInvalidateArrange。这会强制完成新的布局/渲染周期。