我有一个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}是后缀。但我无法弄清楚该怎么做。我知道这很简单,但我不能把手指放在上面!
请帮忙!
答案 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>
谢谢,克莱门斯!