2014-02-07 2 views
5

У нас есть программа, которую мы используем для проверки и проверки продукта промышленного контроля, который мы продаем. Мы хотели бы иметь возможность предложить сокращенную или облегченную версию этого для некоторых клиентов.«Условная компиляция» в XAML?

Наша программа написана с использованием C# и WPF (таким образом, XAML). Имея разделы C# код, который только построить для использования в нашей фабрике легко сделать с помощью условных функций компиляции, например,

#if FACTORY 
    // our in-house code . . . 
    . . . 
    . . . 
#endif 

Но как мы можем сделать что-то подобное для XAML части нашей программы?

Примечание: ** Есть вопрос о переполнении стека на эту тему, где кто-то отправил краткий ответ со ссылкой, но ссылка, похоже, не связана с вопросом. Так что не рассчитывайте это как дубликат на основании, что, поскольку это не отвечает на вопрос. * XAML Conditional Compilation

+0

Вы можете добавить более подробную информацию о каком типе функций вы хотите отключить? поскольку XAML просто «определяет UI» - я не могу представить, какие части XAML вы хотите условно скомпилировать. –

+1

Существует [ответ] (http://stackoverflow.com/a/19940157/259206) на другой вопрос, который выглядит многообещающим. –

+0

Есть кнопки и другие компоненты пользовательского интерфейса, которые мы хотели бы иметь и иметь только на заводе. – user316117

ответ

2

Методика проиллюстрирована в связанном вопрос/ответ может пройти определенный путь к предоставлению условной обработки из XAML элементов , но я не думаю, что это даст вам именно то, что вам нужно.

Есть еще два варианта, которые могут быть лучше подходят для ваших нужд: программная условная компиляция и условное включение во время сборки.

Для программной условной компиляции вы можете использовать регулярную условную компиляцию в коде позади вашего представления (предпочтительнее, так как это элемент пользовательского интерфейса, который вы затрагиваете) или в модели viewmodel (не такой чистый, но вполне приемлемый, если вам нужно включить его в несколько слоев). Эта условная компиляция может использоваться для изменения значений, возвращаемых из свойств (путем изменения тех строк, которые были скомпилированы и, следовательно, выполнены) или путем исключения блоков кода (это неудобно, но все еще эффективно), тогда вы можете иметь XAML DataTrigger, который имеет expression dependent on the conditionally compiled code.

Другой вариант - указать control templates in a XAML resource file и либо программно выбрать их, либо использовать свойство MSBuild в ItemGroupexpression in your proj file, чтобы контролировать, какие файлы включены в сборку. В сочетании с обычной программной условной компиляцией в ваших моделях/режимах просмотра это должно дать вам хорошее чистое решение для вашей проблемы - на самом деле, используя эту опцию, вам, возможно, даже не нужна программная условная компиляция.

ШаблонSelector также может помочь, но IMVHO его немного грязный взломать. Предполагается, что шаблон TemplateSelector заменит шаблон на основе типа, но вы также можете использовать его для включения дополнительного кода для определения используемого шаблона - это может быть хорошим местом для включения условно скомпилированного кода.

+0

+1 для указания шаблонов будут ли они шаблонами управления/пользовательскими элементами управления и т. Д. –

+0

Альтернативное предложение было предложено Томером Шарманом (http://social.msdn.microsoft.com/Forums/wpapps/en-us/baee88bf-52c6-420f-bb71-96bc97e37fe4/any-way-to-get-alternatecontent-choice-tags-working-in-xaml? forum = wpdevelop) с подключенным свойством. Это не условная компиляция, хотя я считаю, что контент выбирается во время выполнения. Тем не менее, это еще один вариант рассмотрения. –

1

Я бы использовал преобразование XSTL, this MSDN article объясняет, как применять их во время компиляции. Должна быть возможность настроить преобразование на полосковые секции внутри тегов перед процессором (this SO question, как видно, показывает это), хотя я, вероятно, сам разместил бы их в комментариях, чтобы вы не нарушили конструктор Visual Studio. Также есть this SO question, в котором показано, как включать директивы процессора в виде обычных тегов XML, которые вы могли бы снова встроить в свой XAML.

0
  1. Определить константу компилятора FACTORY.

  2. Создание разметки класс расширения:

    using System; 
    using System.Windows.Markup; 
    
    namespace Conditional 
    { 
        public class Condition : MarkupExtension 
        { 
         public object MyFactory { get; set; } 
         public object Other { get; set; } 
    
         public override object ProvideValue(IServiceProvider sp) 
         { 
         #if FACTORY 
          return this.MyFactory; 
         #else 
          return this.Other; 
         #endif 
         } 
        } 
    } 
    
  3. В XAML разметке:

    • Импорт имен:
     
    xmlns:conditional="clr-namespace:RootNamespace.Conditional" 
    
    • Вставьте этот блок кода, где необходимо условие аль XAML разметка:
     
    <ViewBox> 
        <conditional:Condition> 
         <conditional:Condition.MyFactory> 
          <TextBlock Text="This is My Factory"/> 
         </conditional:Condition.MyFactory> 
         <conditional:Condition.Other> 
          <TextBlock Text="this is other" /> 
         </conditional:Condition.Other> 
        </conditional:Condition> 
    </ViewBox> 
    
Смежные вопросы