Нет способа достичь желаемого без какого-либо значительного кода. Самое простое решение, как вы уже подумали, - использовать конвертер. Это правда, что для этого требуется привязка данных, поэтому оно не так чисто, как статическое значение свойства источника. Однако, поскольку статическое значение свойства source уже является проблемой, вряд ли стоит избегать такого подхода. Вот мое предпочтительное решение: -
Преобразователь: -
public class BaseUriConverter : IValueConverter
{
private Uri myBaseUri;
public BaseUriConverter()
{
myBaseUri = new Uri(Application.Current.Host.Source.AbsoluteUri);
}
public string AdjustPath { get; set; }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Uri uri = new Uri(myBaseUri, AdjustPath);
Uri result = new Uri(uri, (string)parameter);
return result.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException("This converter only works for one way binding");
}
}
На ресурсе в App.Xaml: -
<local:BaseUriConverter x:Key="BaseUri" AdjustPath=".." />
Обратите внимание, что использование ".." допускает типичное использование. Где Xap находится в папке Clientbin папки приложения. Следовательно, изображения могут храниться в общей папке относительно папки приложения, и это работает независимо от того, запущен ли сайт в Visual Studio или установлен как корневой сайт в IIS.
Тогда изображение на странице где-то может выглядеть так: -
<Image DataContext="0" Source="{Binding Converter={StaticResource BaseUri}, ConverterParameter='images/Test.jpg' }" />
Обратите внимание, что свойство DataContext
установлено, следовательно, происходит привязка, конвертер не беспокоится о значении. Также в этом случае путь является относительным.
В вашем конкретном примере вы можете назначить в коде свой фиксированный baseURL свойству AdjustPath преобразователя, однако я подозреваю, что в нынешнем виде это будет соответствовать вашим потребностям.