Ошибка показывает ng2-toastr, поэтому вам может потребоваться заменить ng2-toastr на ngx-toastr.
Пожалуйста, обратитесь к указанной ссылке , чтобы добавить ngx-тостер.
Или же вы можете перейти по данной ссылке
.
Я думаю, что выяснил, как сделать это. Проблема состояла в том, что сгенерированные объекты не были добавлены к визуальному дереву. После некоторого поиска лучшее, которое я мог придумать, должно назвать некоторые защищенные методы 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);
}
}
Просто быстрый взгляд, если ListBox использует VirtualizingStackPanel - возможно, будет достаточно заменить им с StackPanel как
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
<ItemsPanelTemplate>
<ListBox.ItemsPanel>
Lua поддерживает функциональное программирование и основан на стиле программирования на основе прототипа , который является гибким и мощным.
ИМО это интересный язык.
Если вы хотите прочитать некоторые мысли о наследовании прототипа, я предлагаю вам
Прочитайте запись в блоге Стива Егге The Universal Design Pattern .
точка универсальной токарной машины (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);
}
Этот подход делает инициализацию/проверку строки, когда она впервые отображается, так что он не будет делать все строки сверху. Если вы можете жить с этим, то, возможно, это более элегантный метод.