На unix.stackexchange.com был задан похожий вопрос, и пользователь manatwork предложил перекодировать, что очень хорошо помогает.
Я использую его для преобразования ucs-2 в utf-8 вместо
recode ucs-2..utf-8 *.txt
Вы можете связать событие с событием Loaded или Initialized на странице из ваших markupextensions, возможно. Или, возможно, вы могли бы поместить свое расширение разметки в файл XAML после упоминания Foo.Document.
Спасибо, Роб Релиа Команда WPF / XAML мой блог
Метод ProvideValue вызывается дважды, один раз, когда XAML оценивается парсером, и один раз, когда загружаются значения. При первом вызове targetObject - это просто некий фиктивный объект SharedDP, а не объект, к которому применяется расширение markupextension. Вам нужно пропустить этот первый вызов и работать только со вторым вызовом. В нашем приложении работает следующий код.
public override object ProvideValue(IServiceProvider serviceProvider){
var pvt = serviceProvider as IProvideValueTarget;
if (pvt == null)
{
return null;
}
var frameworkElement = pvt.TargetObject as FrameworkElement;
if (frameworkElement == null)
{
return this;
}
//.... Code will run once the markup is correctly loaded
var dataContext = frameworkElement.DataContext;
}