2016-11-15 5 views
0

나는 (지금까지) 2 가지 디스플레이 모드, 일반 모드 및 위젯 모드가있는 WPF 앱이 있습니다.WPF XAML에서 이미지 소스를 동적으로 수정하는 방법

MVVM 디자인 패턴이있는 Prism 6을 사용하고 있습니다.

MainWindowViewModel은 표시 모드를 알고 있습니다.

ToolBarView는 예상대로 단추의 도구 모음을 가지며 단추는보기 모드에 따라 다른 이미지로 동적으로 변경됩니다. 모드가 WidgetMode이면 동일한 이름이지만 '_w'가 추가 된 이미지로 전환됩니다. 그래서 "image.png"대신에 "image_w.png"입니다.

내가하고 싶은 것은 모드에 따라 String.Empty 또는 "_w"로 업데이트되는 ToolBarView에서 문자열을 만드는 것입니다. 또한 이미지 루트 폴더를 하드 코드 된 문자열이 아닌 전역 문자열로 지정하여 app.xaml에 정의했습니다.

<Application.Resources> 

    <sys:String x:Key="ImageURIRoot">/MyApp;component/media/images/</sys:String> 
</Application.Resources> 

그런 다음 내 toolbarview (UserControl을)에, 나는이 한 : 문자열이 하드 코딩 된 것을

<UserControl.Resources> 
    <converters:StringToSourceConverter x:Key="strToSrcConvert"/> 

    <sys:String x:Key="BtnImgSuffix">_w</sys:String> 
. 
. 
. 
</UserControl.Resources> 

참고; 결국, 나는 창 모드를 기반으로 동적으로 그것을 바꿀 것이다.

public class StringToSourceConverter : IValueConverter 
{ 


    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (parameter is string) 
     { 
      return string.Format(parameter.ToString(), value); 
     } 
     return null; 
    } 

    public object ConvertBack(object value, Type targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 

그래서 작동합니다

나는 다음 목록 상자에서

<ListBoxItem Style="{StaticResource MainButton_Container}"> 
       <Button Command="{Binding ButtonActionDelegateCommand}" Style="{StaticResource Main_Button}"> 
        <Image Source="{Binding Source={StaticResource ImageURIRoot}, Converter={StaticResource strToSrcConvert}, ConverterParameter='{}{0}button.png'}" /> 
       </Button> 
      </ListBoxItem> 

변환기 코드를 버튼을 넣어. 하지만 내가 원하는 것은 ConverterParameter를 {{} {0} 버튼 {1} .png "과 같게하는 것입니다. 여기서 {0}은 URI 루트이고 {1}은 접미사입니다. 그러나 나는 그것을하는 방법을 알아낼 수 없습니다. 나는 그것이 간단하다는 것을 알고 있지만, 나는 그것에 손가락을 대지 않을 수있다!

도와주세요!

+1

멀티 바인딩을 사용하십시오. – Clemens

답변

0

알아 냈으므로 멀티 바인드를 사용했습니다. 내가 한 방식은 IMultiValueConverter에서 상속받은 변환기를 만드는 것입니다. 그것의 "변환"방법은 다음과 같습니다

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
{ 


    ImageSourceConverter conv = new ImageSourceConverter(); 

    int suffixPos = ((String)parameter).Length - 4; 
    var returnValue = ((String)parameter).Insert(suffixPos, values[1].ToString()); 

    returnValue = Path.Combine(values[0].ToString(), returnValue); 

    ImageSource imgsrc = conv.ConvertFromString(returnValue) as ImageSource; 

    return imgsrc;    

} 

XAML은 다음과 같습니다

<Image Height="30" Width="40" diag:PresentationTraceSources.TraceLevel="High"> 
    <Image.Source> 
     <MultiBinding Converter="{StaticResource stringsToSrcConvert}" ConverterParameter="buttonImg.png"> 
      <Binding Source="{StaticResource ImageURIRoot}"/> 
      <Binding Source="{StaticResource BtnImgSuffix}"/> 
     </MultiBinding> 
    </Image.Source> 
</Image> 

는 또한의 URIRoot에게 클레멘스

<Application.Resources>   
    <sys:String x:Key="ImageURIRoot">pack://application:,,,/MyApp;component/media/images/</sys:String> 
</Application.Resources> 

감사를 수정했다!

관련 문제