ItemsControl не будет повторно отображаться после отображения всплывающего окна. - PullRequest
4 голосов
/ 31 января 2012

У меня есть ItemsControl в окне, один из столбцов которого содержит простую очень узкую панель стека, которая служит просто целью для всплывающего окна , которое отображается при определенных обстоятельствах.

После того, как было показано и пользователь о чем-то проинформирован, пользователь закрывает это всплывающее окно с помощью кнопки (команда, связанная с этой кнопкой, просто устанавливает свойство представлениямодель, к которой Popup.IsOpen привязан к false ).

Popup закрывается, но его изображение остается отпечатанным на ItemsControl до тех пор, пока он не будет прокручен или другое окно не будет перекрывать его.

Как перекрасить ItemsControl после закрытия Popup ?

Код:

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 ]

2 голосов
/ 12 мая 2013

Вот моя рабочая площадка:

В родительском окне элемента управления:

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

После закрытия всплывающего окна вызовите метод Refresh ().

0 голосов
/ 31 января 2012

Трудно догадаться, что мешает вашему ItemsControl перерисовать после закрытия всплывающего окна. Обычно этого не должно происходить.

Одна вещь, которую вы всегда можете сделать, это вызвать InvalidateVisual или InvalidateArrange в ItemsControl. Это заставляет полностью новый цикл макета / рендеринга.

0 голосов
/ 31 января 2012

Когда всплывающее окно закрывается, что произойдет, если вы установите Visibility = Collapsed?Похоже, это очень хорошо уберет его из поля зрения.

В противном случае я не знаю способа перерисовки одного элемента, и метод ItemsControl.Refresh перезагрузит все ваши элементы (и обычно приводит к глупости отображения (элементы исчезают и появляются снова, анимации сбрасываются и т. Д.).

...