Условный xaml Silverlight 3 и Silverlight 4

Я сейчас работаю над проектом, который должен разделять файлы проекта. Один соответствует Silverlight 3, а другой - Silverlight 4. Проект создает пользовательский элемент управления, который используется в паре других проектов. К сожалению, один из них находится в SL3 и не может быть обновлен прямо сейчас, поэтому необходима SL3 версия элемента управления.

Пока все работает нормально, но недавно я попытался добавить ViewBox в элемент управления. Это вызывает проблему, потому что в SL3 он находится в наборе инструментов, а в SL4 - в ядре.

Есть ли способ получить его из набора инструментов в проекте SL3 и ядра в проекте SL4? Я изучил определения препроцессора в xaml и нашел некоторую информацию, но мне не нравится, как это убивает возможность загрузки кода в конструкторе.


person thecaptain0220    schedule 11.07.2011    source источник


Ответы (3)


В итоге я создал рамку вокруг внутренних элементов окна просмотра. Затем я избавился от окна просмотра в xaml. Когда я загружаю элемент управления, я устанавливаю для дочернего элемента содержащей границы значение null, создаю окно просмотра в коде и устанавливаю его дочерний элемент на внутреннюю границу. Затем я устанавливаю дочернюю границу, содержащую границу, в окно просмотра.

<Border Name="viewBoxContainer">
    <Border x:Name="innerBorder">
        <TextBlock x:Name="innerText" Text="Test" />
    </Border>
</Border>

Код позади

this.viewBoxContainer.Child = null;
this.viewBoxContainer.Child = new Viewbox { Child = this.innerBorder};
person thecaptain0220    schedule 11.07.2011

Нет, в XAML нет поддержки условного усложнения. Как насчет создания собственного подкласса в каждом проекте:

в рамках проекта SL3:

using //namespace for SL3 ViewBox

namepsace MyProjectNamespace
{    
    public class MyViewBox : ViewBox
    {
    }    
}

в рамках проекта SL4:

using //namespace for SL4 ViewBox

namepsace MyProjectNamespace
{    
    public class MyViewBox : ViewBox
    {
    }    
}

в вашем общем файле XAML:

<UserControl ...
      xmlns:local="clr-namespace:MyProjectNamespace">
  <local:MyViewBox>
    .. content goes here ..
  </local:MyViewBox>
</UserControl>
person ColinE    schedule 11.07.2011
comment
Хорошо - как насчет UserControl, который инкапсулирует ViewBox? - person ColinE; 11.07.2011
comment
Я думал об этом, но окно просмотра все равно будет в xaml - person thecaptain0220; 11.07.2011
comment
Нет, у вас другой пользовательский элемент управления для SL3 и SL4. - person ColinE; 11.07.2011

У нас была та же проблема, и мы решили создать собственное окно просмотра, которое использовалось повсеместно.

По сути, мы просто взяли исходный код Viewbox, предоставленный в наборе инструментов SL3, скопировали его и поместили в наше собственное пространство имен, а затем переименовали его во что-то вроде MyViewbox.

Не уверен, что это лучшее решение, но у нас оно сработало.

person RobSiklos    schedule 21.07.2011