Принуждение WPF создать объекты в ItemsControl

Ошибка показывает ng2-toastr, поэтому вам может потребоваться заменить ng2-toastr на ngx-toastr.

Пожалуйста, обратитесь к указанной ссылке , чтобы добавить ngx-тостер.

Или же вы можете перейти по данной ссылке

.

6
задан Andy 10 March 2009 в 15:18
поделиться

3 ответа

Я думаю, что выяснил, как сделать это. Проблема состояла в том, что сгенерированные объекты не были добавлены к визуальному дереву. После некоторого поиска лучшее, которое я мог придумать, должно назвать некоторые защищенные методы VirtualizingStackPanel в ListBox. В то время как это не идеально, так как это только для тестирования, я думаю, что оказываюсь перед необходимостью жить с ним.

Это - то, что работало на меня:

VirtualizingStackPanel itemsPanel = null;
FrameworkElementFactory factory = control.ItemsPanel.VisualTree;
if(null != factory)
{
    // This method traverses the visual tree, searching for a control of
    // the specified type and name.
    itemsPanel = FindNamedDescendantOfType(control,
        factory.Type, null) as VirtualizingStackPanel;
}

List<string> generatedItems = new List<string>();
IItemContainerGenerator generator = this.ItemsListBox.ItemContainerGenerator;
GeneratorPosition pos = generator.GeneratorPositionFromIndex(-1);
using(generator.StartAt(pos, GeneratorDirection.Forward))
{
    bool isNewlyRealized;
    for(int i = 0; i < this.ItemsListBox.Items.Count; i++)
    {
        isNewlyRealized = false;
        UIElement cntr = generator.GenerateNext(out isNewlyRealized) as UIElement;
        if(isNewlyRealized)
        {
            if(i >= itemsPanel.Children.Count)
            {
                itemsPanel.GetType().InvokeMember("AddInternalChild",
                    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMember,
                    Type.DefaultBinder, itemsPanel,
                    new object[] { cntr });
            }
            else
            {
                itemsPanel.GetType().InvokeMember("InsertInternalChild",
                    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMember,
                    Type.DefaultBinder, itemsPanel,
                    new object[] { i, cntr });
            }

            generator.PrepareItemContainer(cntr);
        }

        string itemText = GetControlText(cntr);
        generatedItems.Add(itemText);
    }
}
1
ответ дан 17 December 2019 в 00:15
поделиться

Просто быстрый взгляд, если ListBox использует VirtualizingStackPanel - возможно, будет достаточно заменить им с StackPanel как

<ListBox.ItemsPanel>
  <ItemsPanelTemplate>
      <StackPanel/>
  <ItemsPanelTemplate>
<ListBox.ItemsPanel>
3
ответ дан 17 December 2019 в 00:15
поделиться

Lua поддерживает функциональное программирование и основан на стиле программирования на основе прототипа , который является гибким и мощным.

ИМО это интересный язык.

Если вы хотите прочитать некоторые мысли о наследовании прототипа, я предлагаю вам
Прочитайте запись в блоге Стива Егге The Universal Design Pattern .

-121--933842-

точка универсальной токарной машины (UTM) в том, что для любой машины Тьюринга (TM) можно взять эту ТМ и создать для нее кодировку, описывающую работу ТМ и выполняющую эту кодировку на другой ТМ.

UTM - это TM, который имеет достаточно мощное определение, чтобы в него можно было переписать любое другое определение TM.

Считайте UTM интерпретатором. TM - это конкретная задача.

Если ТМ не относится также к классу устных переводчиков, то он также не является УТМ. (Поскольку UTM также является специально назначенным TM).

Итак, чтобы ответить на ваш второй вопрос: если вы можете показать, что UTM и TM эквивалентны, то вы показали, что TM также является UTM. Для этого необходимо показать, как кодированную программу для UTM можно преобразовать в эквивалентную программу для TM.

-121--3348439-

Возможно, вы делаете это неправильно. То, что я сделал, это подключил событие Loaded [содержимого] моего DataTemplate:

<DataTemplate DataType="{x:Type local:ProjectPersona}">
  <Grid Loaded="Row_Loaded">
    <!-- ... -->
  </Grid>
</DataTemplate>

... и затем обработал только что отображенную строку в обработчике событий:

private void Row_Loaded(object sender, RoutedEventArgs e)
{
    Grid grid = (Grid)sender;
    Carousel c = (Carousel)grid.FindName("carousel");
    ProjectPersona project = (ProjectPersona)grid.DataContext;
    if (project.SelectedTime != null)
        c.ScrollItemIntoView(project.SelectedTime);
}

Этот подход делает инициализацию/проверку строки, когда она впервые отображается, так что он не будет делать все строки сверху. Если вы можете жить с этим, то, возможно, это более элегантный метод.

3
ответ дан 17 December 2019 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: