2012-01-31 1 views
4

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

После того, как было показано, и пользователь был проинформирован о чем-то, как пользователь закроет этот Popup с помощью кнопки (команды, связанной с этой кнопкой только устанавливает свойство модели представления, к которому 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; 
    ... 
} 
+0

Вы могли бы разместить фотографию о том, что вы имеете в виду? Или, может быть, какой-то код? Я думаю, Popups нарисованы на другом слое, чем на слое пользовательского интерфейса, поэтому перерисовка ItemsControl может ничего не делать – Rachel

+0

Я не могу воспроизвести вашу проблему. Когда я закрываю всплывающее окно, все закрывается красиво. Можете ли вы показать нам свою разметку? Но что-то, как это должно работать: <Всплывающее Closed = "myPopup_Closed" ... частная пустота myPopup_Closed (объект отправителя, EventArgs е) { myItemsControl.InvalidateVisual(); } – SvenG

+0

Я никогда не видел всплывающее окно в DataTemplate, и для меня это не похоже на действительный подход, но я не уверен. Что говорят другие? – Clemens

ответ

0

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

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

+0

1) Я попытался установить свойство Видимость Collapsed (вместе с IsOpen) с помощью привязки данных - результат тот же 2) Я не знаю метода ItemsControl.Refresh(). Это действительно существует? – Niccolo

+0

Я знаю, что Listbox.Items.Refresh существует, а также другие воплощения ItemsControl. Он действительно просто сообщает элементу управления элементам распоряжаться нарисованными элементами, запрашивать коллекцию предметов и перерисовывать их. – CodeWarrior

+1

Чтобы быть уверенным, что при изменении свойства IsOpen * что-то происходит визуально правильно? Если нет, у вас есть INotifyPropertyChanged? – CodeWarrior

0

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

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

+0

Для повторной обработки ItemsControl я добавил обработчик события GotFocus (который выполняется после закрытия всплывающего окна, и окно, в котором находится элемент ItemsControl, получает фокус). В этом обработчике я вызвал метод UpdateLayout() элемента ItemsControl, но след всплывающего окна остался. – Niccolo

+1

О, я запутал UpdateLayout и InvalidateVisual и обновил свой ответ. Спасибо SvenG и извините за путаницу. – Clemens

+0

Я пробовал их все в обработчике кода GotFocus: UpdateLayout, InvalidateVisual и InvalidateArrange - к сожалению, ни один из них не помог перерисовать ItemsControl – Niccolo

2

Здесь мой workground:

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

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() метод.

+0

Я пробовал все, что мог придумать в управляемом коде, но всплывающее окно не было стерто после его закрытия. Это решение, используя собственный вызов, сделало трюк. – ken

 Смежные вопросы

  • Нет связанных вопросов^_^