2010-03-13 3 views
12

Я новичок в XAML, поэтому предположим, что мне не хватает чего-то простого. Я хочу, чтобы заменить часть пути на пути источника с переменным током # постоянная для более легкого путем управления, например, у меня есть:В WPF XAML как я могу конкатенировать 2 константы, поэтому я могу использовать заранее определенные пути?

<Image Source="/Images/Themes/Buttons/MyPicture.png" /> 

и в другом классе я моя константа, определенный:

public static readonly string UriImagesButtons = "/Images/Big/PNG/"; 

I хотят иметь что-то вдоль линий:

<Image Source="{static:UriImagesButtons + MyPicture.png}" /> 

Это означает, что я могу изменить путь в глобальном масштабе на инсульт, если возникнет необходимость. Каков синтаксис для этого?

ответ

2

Замена пути означает, что вы должны выполнить привязку данных ... Так почему бы вам не сохранить в своем классе C# полный путь к файлу и связать с ним?

+0

Я не хотел спускаться по этому маршруту, поскольку у меня есть многочисленные изображения, и это будет означать, что мне нужна константа для каждого, что отрицает любую простоту управления. – Philip

2

Вы должны взглянуть на обсуждении этой темы: string manipulation in xaml attribute

В принципе, вы можете создать свое собственное расширение разметки, которая принимает 2 параметр и сцепляет их. Этот конкретный пример также используется для привязки. Я подозреваю, что вы хотели бы привязываться к тому, где определен корневой путь или какие-то другие данные.

+0

Хорошо, имеет смысл. Будет ли это иметь заметную производительность, если это широко используется в приложении? – Philip

+0

Хмм, я не знаю. Я полагаю, это зависит от того, что «обширно». –

17

Самый простой способ сделать это с MultiBinding с StringFormat:

<Path> 
    <Path.Source> 
     <MultiBinding StringFormat="{}{0}{1}"> 
      <Binding Mode="OneTime" Source="{x:Static lcl:ConstantOwner.UriImagesButtons}" /> 
      <Binding Mode="OneTime" Source="MyPicture.png" /> 
     </MultiBinding> 
    </Path.Source> 
</Path> 

В параметре StringFormat, вам придется бежать первый фигурную скобку с «{}», так что XAML анализатор Безразлично» t думаю, что это расширение разметки.

+0

Удобное решение. Что меня удивляет обо всех этих проблемах, но в том, что в VB старой школы вы просто определяете константу, тогда компилятор добавит ее во время компиляции, когда увидит конкатентацию строк. Простое управление кодами хорошо и быстро реализуется. Я действительно удивлен, что в XAML не существует (простого) способа сделать это? Все ли жесткие коды всех своих путей в XAML или используют один из других методов в (отличных) ответах до сих пор? Кажется, это большой прыжок назад в управлении для меня ...? – Philip

+0

+1. Ницца. Мне нравятся решения, которые используют существующие вещи, вместо того, чтобы требовать, чтобы новые были написаны. –

+0

@Philip, в вашем коде (может быть C# из VB), вы определяете константу в моем решении. MultiBinding - это самый простой способ объединить строки. –

Смежные вопросы