[WPF] Как назначит один Popup на все элементы в ListView
От: danilanv  
Дата: 23.12.10 10:33
Оценка:
Здравствуйте. Есть список ListView. Нужно было сделать так, чтобы при клике по элементу в списке открывалось всплывающее окно с контролами для редактирования этого элемента. Воспользовавшись постом notacat
Автор: notacat
Дата: 19.11.09
сделал. Получило следующее:

Список:
<ListView.View>
...
 <GridViewColumn Header="*">
   <GridViewColumn.CellTemplate>
    <DataTemplate>
     <ComboBox Template="{StaticResource conditionSelectionTemplate}"/>
    </DataTemplate>
   </GridViewColumn.CellTemplate>
 </GridViewColumn>
...
</ListView.View>

Шаблон:

<ControlTemplate x:Key="conditionSelectionTemplate" 
                     TargetType="{x:Type ComboBox}">
        <StackPanel>
            <CheckBox x:Name="qwe"
                      IsChecked="{Binding Path=IsDropDownOpen, 
                        RelativeSource={RelativeSource TemplatedParent}}">                
                <CheckBox.Template> 
                  ...                   
                </CheckBox.Template>                
            </CheckBox>
            <Popup Name="popup" StaysOpen="True" 
                   PlacementTarget="{Binding ElementName=qwe}" 
                   IsOpen="{Binding Path=IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}"
                   DataContext="{TemplateBinding DataContext}"
                   MaxHeight="200">
           Большой и длинный код popop'a
           </Popup>
</ControlTemplate>


Как видно из картинки, всплывающее окно получилось довольно массивным в плане количества контролов внутри него. Проблема в том, что это всплывающее окно создается для каждого элемента в списке, что приводит к ощутимым тормозам при создании списка, который формируется динамически.
Как можно сделать так чтобы использовалось одно и то же всплывающее окно для разных элементов списка?
Re: [WPF] Как назначит один Popup на все элементы в ListView
От: Аноним  
Дата: 23.12.10 10:59
Оценка:
Обычно вставляют большое меню (или небольшое)если оно разделяемое
в ресурсы, в какие решать тебе (окна, данного элемента, или глобальные)
В элементе ссылаешься на ресурс, конструкция {StaticResource ... }
Дальше сам
Re[2]: [WPF] Как назначит один Popup на все элементы в ListV
От: danilanv  
Дата: 23.12.10 11:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Обычно вставляют большое меню (или небольшое)если оно разделяемое

А>в ресурсы, в какие решать тебе (окна, данного элемента, или глобальные)
А>В элементе ссылаешься на ресурс, конструкция {StaticResource ... }
А>Дальше сам

Не очень понятно какое меню куда вставлять... В данном случае popup является частью шаблона combobox. То есть попап отображается в случае когда юзер кликает левой кнопкой мышки по соответствующему контролу в списке (крестик на рисунке).
Подозреваю что вы имели в виду ContextMenu, который действительно можно просто засунуть в ресурсы и сослаться на него где нужно. Вопрос в том, как это сделать с попапом...
Re: [WPF] Как назначит один Popup на все элементы в ListView
От: notacat  
Дата: 23.12.10 12:53
Оценка:
все-таки для редактирования логичней было бы показывать обычный диалог. Или у вас это xbap?
Re[2]: [WPF] Как назначит один Popup на все элементы в ListV
От: danilanv  
Дата: 24.12.10 05:42
Оценка:
Здравствуйте, notacat, Вы писали:

N>все-таки для редактирования логичней было бы показывать обычный диалог. Или у вас это xbap?

нет, это не xbap...
Re: [WPF] Как назначит один Popup на все элементы в ListView
От: Vladek Россия Github
Дата: 26.12.10 22:27
Оценка:
Здравствуйте, danilanv, Вы писали:

D>Здравствуйте. Есть список ListView. Нужно было сделать так, чтобы при клике по элементу в списке открывалось всплывающее окно с контролами для редактирования этого элемента. Воспользовавшись постом notacat
Автор: notacat
Дата: 19.11.09
сделал. Получило следующее:


Пока не поздно, возьмите DataGrid — его создали специально для вас. У него есть замечательное свойство RowDetailsTemplate, куда можно впихнуть все эти контролы и не извращаться над ComboBox-ом.

D>Как видно из картинки, всплывающее окно получилось довольно массивным в плане количества контролов внутри него. Проблема в том, что это всплывающее окно создается для каждого элемента в списке, что приводит к ощутимым тормозам при создании списка, который формируется динамически.


Тормоза обычно в биндингах и работе, которая производится в UI-потоке. Создать кучу контролов не проблема, если этому никто не мешает. Выполняйте всю работу по созданию списков в отдельных потоках.

Вот два варианта, как сделать работу, не загружая UI-поток (пишу по памяти, могу ошибаться в порядке параметров).

Пусть был код в каком-нибудь обработчике события, тормозящий всё и нагло ворующий время UI-потока:
var result = InfiniteLoop();
myControl.Content = result;


Переделаем его:

1) Пул потоков, .NET 3.5 SP1
ThreadPool.QueueUserWorkItem(delegate
{
    var result = InfiniteLoop();
    myControl.Dispatcher.BeginInvoke(delegate
    {
        myControl.Content = result;
    },
    DispatcherOperation.Background);
});


2) Задачи, .NET 4
Task.Factory.StartNew<InfiniteLoopResult>(delegate
{
    return InfiniteLoop();
}).
ContinueWith(infiniteLoopTask =>
{
    myControl.Content = infiniteLoopTask.Result;
},
TaskScheduler.FromCurrentSynchronizationContext());



D>Как можно сделать так чтобы использовалось одно и то же всплывающее окно для разных элементов списка?


DataGrid.RowDetailsTemplate
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.