我在一个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()方法.