Answer the question
In order to leave comments, you need to log in
How to transfer all data to the main thread for report output?
Since the program is large, I will highlight only those sections of the code:
There is a WPF object with a FlowDocument:
ReportEngine ReportView = new ReportEngine();
VisualSpaceReport.Document = ReportView.ReportData;
UI.UI_ControlViewer.UI_Viewer.UI_Report.AddLog((sender as Libraries.Events).Value, e.PropertyName);
public void AddLog(object value, string propertyName)// => Dispatcher.InvokeAsync(() =>
{
switch (propertyName)
{
case "Append":
ReportView.Append(value as string, new Libraries.Interfaces.Formatting());
break;
case "Assign":
ReportView.Assign(value as string);
break;
case "Create table":
ReportView.Create(value as string);
break;
case "Close table":
ReportView.Close(value as string);
break;
case "Table":
switch (value)
{
case Structures.TableForProcessing.Add add_process:
ReportView.Add(add_process.id, add_process.text, add_process.value, add_process.formattingText, add_process.formattingValue);
break;
case Structures.TableForProcessing.Assign assign_process:
ReportView.Assign(assign_process.id, assign_process.index, assign_process.value, assign_process.processing);
break;
case Structures.TableForReporting.Setting setting_process:
ReportView.Setting(setting_process.id, setting_process.index, setting_process.background);
break;
case Structures.TableForReporting.Add add:
ReportView.Add(add.id, add.text, add.value); //? add.formatting -- не работает (вызывает конфликт потока [Freezable])
break;
case Structures.TableForReporting.Assign assign:
ReportView.Assign(assign.id, assign.index, assign.select, assign.value, assign.formatting);
break;
}
break;
case "Appendf":
switch (value)
{
case Structures.DataForReporting.Add add:
ReportView.Append(add.text, add.formatting); //? add.formatting -- не работает (вызывает конфликт потока [Freezable])
break;
}
break;
}
VisualSpaceReport.FindScrollViewer()?.PageDown();
}//);
"Cannot use a DependencyObject that belongs to a different thread than its Freezable parent."
public void Append(string text, Interfaces.Formatting formatting = null) //! В отличие от Append в базовых классах он создаёт и добавляет текст. Вариант быстрого создания абзаца с текстом.
{
if (formatting != null) formatting.Margin = new Thickness(0, 0, 0, 10);
ReportData.Blocks.Add(Interfaces.Base.Paragraph.Create(formatting));
Interfaces.Base.Paragraph.Assign(ReportData.Blocks.Last() as Paragraph, text, formatting);
}
public void Assign(string text, Interfaces.Formatting formatting = null)
{
Interfaces.Base.Paragraph.Assign(ReportData.Blocks.Last() as Paragraph, text, formatting);
}
public static System.Windows.Documents.Paragraph Assign(System.Windows.Documents.Paragraph target, string text, Formatting formatting = null)
{
ToSpan(target).Inlines.Clear();
if (formatting != null)
// здесь форматирование не работает от потоков, только те, которые находятся в главном потоке.
ToSpan(target).Inlines.Add(new Run(text)
{
Background = formatting.Background,
Foreground = formatting.Foreground,
FontFamily = formatting.FontFamily,
FontSize = formatting.FontSize,
FontStretch = formatting.FontStretch,
FontStyle = formatting.FontStyle,
FontWeight = formatting.FontWeight,
TextDecorations = formatting.TextDecoration
});
else
ToSpan(target).Inlines.Add(text);
return target;
}
System.InvalidOperationException: "Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток."
System.InvalidOperationException: "Не удается использовать объект DependencyObject, принадлежащий к другому потоку, отличному от его родительского объекта Freezable."
Dispatcher.Invoke(() => { UI.UI_ControlViewer.UI_Viewer.UI_Report.AddLog((sender as Libraries.Events).Value, e.PropertyName); });
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question