Как я могу создавать экземпляры элементов WPF через их тип, когда у них есть статичные сечения?

StackOverflow https://stackoverflow.com/questions/1869953

Вопрос

Мне нужно создавать экземпляры типов WPF (скажем, usercontrol или страницу) через отражение для дизайнера. Проблема, которая у меня возникает, заключается в том, что когда я пытаюсь создать экземпляр с помощью Activator.createInstance, я получаю TargetInvocationException который, в конце концов, исключение, брошенное Статич Расширение разметки.

Разъяснение: Типы находятся в другой сборке, которая загружена во время выполнения!

По всей видимости, Activator.createInstance не может создавать экземпляры типов, которые используют {StaticResource xxx} Расширение разметки, Даже когда статический ресурс определяется в определении типа.

Итак, если все, что у вас есть, это определение следующего типа (тип + XAML -файл):

<Page x:Class="Hurr.Durr">
  <Page.Resources>
    <ControlTemplate x:Key="whatever">
      <TextBlock Text="This is a stupid example."/>
    </ControlTemplate>
  </Page.Resources>
  <ContentControl Template="{StaticResource whatever}" />
</Page>

Как бы вы развернули это во время выполнения?

КСТАТИ, требуя, чтобы вы использовали DynamicResource вместо этого, не приемлемо. Требует ли это Visual Studio? Тем не менее, VS может развернуть копию вашего элемента WPF Framework и закрепить его в дизайнере.


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

http://cid-f8be9de57b85cc35.skydrive.live.com/self.aspx/public/resourcesgokaboom.zip

Приложение пытается загрузить страницу с помощью чертежа в его словаре ресурсов. Я пытаюсь загрузить его динамически, используя Application.LoadComponent а также Activator.createInstance И они оба терпят неудачу.


Хорошо, пример выше работает без проблем. Проблема заключалась в том, что я использовал StaticResource в атрибутах элемента, который ссылался на ресурс, определенный в этом элементе.

Что меня бросало Это работает в Visual Studio. Таким образом, в дизайнере все выглядело Okey Dokey, но IRL все это было в форме груши. ИМХО, это ошибка, и я сообщил об этом как таковой:

https://connect.microsoft.com/visualstudio/feedback/viewfeedback.aspx?feedbackId=519244

Не уверен, что это сбой VS .... неудача, или расширение StaticResource работало в VS, но не IRL.

Это было полезно?

Решение

Проблема, по -видимому, связана со страницей, которую вы пытаетесь загрузить. Ваша страница выглядит так (пропуская кучу XMLN и т. Д. Сантехника):

<AwesomePage Title="AwesomePage" Background="{StaticResource awesomeface}">
    <AwesomePage.Resources>
        <DrawingBrush x:Key="awesomeface" Stretch="Uniform">
            <!-- details snipped -->
        </DrawingBrush>
    </AwesomePage.Resources>
</AwesomePage>

Это пытается использовать ресурс Awesomeface, прежде чем он будет определен. StaticResource не допускает такого рода направления вперед: поэтому StaticResourceExtension.ProvideValue не удается, и вы получаете ошибку, с которой столкнулись.

Чтобы исправить это, поместите границу непосредственно внутрь страницы и переместите фоновый сеттер от страницы на границу. Затем поместите весь свой контент в границу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top