2016-11-15 45 views
0

我有一個WPF應用程序(至今)有兩種顯示模式,regularmode和widgetmode。如何動態修改WPF XAML中的圖像源

我正在使用棱鏡6與MVVM設計模式。

MainWindowViewModel知道顯示模式。

如預期的那樣,ToolBarView具有按鈕的工具欄,根據視圖的模式,按鈕應動態地更改爲不同的圖像。如果模式爲WidgetMode,則切換到名稱相同但帶有'_w'的圖像。因此,而不是「image.png」,它是「image_w.png」。

我想要做的是在ToolBarView中創建一個字符串,根據模式更新爲String.Empty或「_w」。我還希望圖像根文件夾是一個全局字符串,而不是一個硬編碼的字符串,所以我已經在app.xaml中定義了它。

<Application.Resources> 

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

然後在我的toolbarview(一個用戶控件),我這樣做:

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

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

注意,該字符串是硬編碼;最終,我會根據窗口模式動態更改它。

然後我把按鈕放在一個列表框

<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> 

轉換代碼:

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; 
    } 
} 

使作品。但我想要的是使ConverterParameter等於「{} {0}按鈕{1} .png」,其中{0}是URI Root,{1}是後綴。但我無法弄清楚如何去做。我知道這很簡單,但我不能把手指放在上面!

請幫忙!

+1

使用MultiBinding。 – 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> 

謝謝,克萊門斯!