如何动态修改WPF XAML中的图像源

时间:2016-11-15 20:35:32

标签: c# wpf xaml string-formatting prism

我有一个WPF应用程序(到目前为止)有2种显示模式,regularmode和widgetmode。

我正在使用Prism 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>

请注意,字符串是硬编码的;最终,我将根据windowmode动态更改它。

然后我将按钮放在列表框中

<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根,{1}是后缀。但我无法弄清楚该怎么做。我知道这很简单,但我不能把手指放在上面!

请帮忙!

1 个答案:

答案 0 :(得分:0)

想出来,这是通过多重绑定。我这样做的方法是创建一个继承自IMultiValueConverter的转换器。它&#34;转换&#34;方法如下所示:

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>

谢谢,克莱门斯!