2016-11-15 42 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.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> 

おかげで、クレメンスを変更する必要がありました!

関連する問題