我在一个窗口上有一个 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;
...
}
答案 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上调用InvalidateVisual或InvalidateArrange。这会强制完成新的布局/渲染周期。