Silverlight中动态图像源绑定

3

我希望能够根据ChildWindow中的DataContext设置图像的来源。以下是XAML文件:

<controls:ChildWindow x:Class="CEM.Controls.DialogWindow"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" Title="{Binding Title}">
  ...
  <Image x:Name="DialogIcon"></Image>
  ...
</controls:ChildWindow>

如果我重写ChildWindowShow方法并设置图像源,则它可以正常工作:

public new void Show()
{
    DialogIcon.Source = new BitmapImage(new Uri(@"/Images/DialogWindow/Confirm.png", UriKind.Relative));
    base.Show();
}

但是它看起来很丑,也不符合“Silverlight的方式”,因此我决定进行更改:

<Image x:Name="DialogIcon" Source="{Binding DialogIconType, Converter={StaticResource DialogIconConverter}}"></Image>

您可以看到,我已经注册了一个DialogIconConverter来绑定来自DataContext的源。

public class DialogIconConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
       //currently it's an hard-coded path
       return new BitmapImage(new Uri(@"/Images/DialogWindow/Confirm.png", UriKind.Relative));
    }
    ...
 }

但现在它不起作用了,我在这个控件中有几个其他的转换器,它们都正常工作,只有这一个不工作。你能帮忙找到问题出在哪里吗?

编辑:DialogIconType是一个枚举,并且它是DialogContext的属性。一个DialogContext实例将被分配给DialogWindowDataContext属性。

public enum DialogIconType
{ 
    Confirm,
    Alert,
    Error
}
public class DialogContext
{
    public string Title { get; set; }
    public string Content { get; set; }
    public DialogButtons Buttons { get; set; }
    public DialogIconType IconType { get; set; }
}
internal DialogWindow(DialogContext context)
{
    InitializeComponent();
    this.DataContext = context;
}

你尝试使用"Images/DialogWindow/Confirm.png"而不是"/Images/DialogWindow/Confirm.png"了吗? - Jakob Christensen
2个回答

2
假设 DialogIconType 是您图像的路径(例如 "Images/DialogWindow/Confirm.png"),则以下代码无需使用值转换器即可正常工作:
<Image Source="{Binding DialogIconType}" />

编辑:

从值转换器的Convert方法返回图像路径也是可能的,例如:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return "Images/DialogWindow/Confirm.png";
}

编辑2:

以下内容也可以使用UriKind.Relative实现:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return new BitmapImage(new Uri("Images/DialogWindow/Confirm.png", UriKind.Relative));
}

@Jakob:不起作用。因为ImageSource属性是ImageSource类型,而不是string类型。我们可以在XAML中将字符串值分配给Source属性,因为它将被转换为ImageSource,因为Image类中有一个名为SourcePropertyDependencyProperty。但是,如果您实现自己的Converter,则必须返回确切的类型。 - Cheng Chen
@Danny Chen: 嗯... 对我来说可以。你用的是哪个版本的Silverlight? - Jakob Christensen
@Jakob:SL4。我认为问题不是因为“/”,因为当我将其放入“Show()”方法中时,它可以正常工作。 - Cheng Chen
当你运行调试时,输出窗口是否出现任何绑定错误? - Jakob Christensen
@Danny Chen:抱歉,我无法帮助你解决Prism的问题。不过听起来你的项目可能出了些问题。对我而言,ValueConverter运行得非常完美。 - Jakob Christensen

2

可能有些愚蠢,但您确定在XAML文件中正确引用了您的转换器吗?

否则,我建议尝试使用此语法作为URI的路径(将图像设置为资源):

return new BitmapImage(new Uri("pack://application:,,,/Images/DialogWindow/Confirm.png", UriKind.Relative));

编辑:

好的,我想我明白了:

查看您的输出窗口,您可能会看到一些错误40绑定...等等...

我的猜测是转换器是正确的,但绑定源不正确,因此基本上转换器甚至没有被使用。

原因是您的DialogIconType不是依赖属性,因此无法进行绑定。

换句话说,这个:

public DialogIconType IconType { get; set; }

should become this :

public static DependencyProperty IconTypeProperty = DependencyProperty.Register("IconType", typeof(DialogIconType), typeof(DialogContext));
public DialogIconType IconType
{
    get { return (DialogIconType)(GetValue(IconTypeProperty)); }
    set { SetValue(IconTypeProperty , value); }
}

此外,在您的Xaml中,您应该绑定到“IconType”,而不是“DialogIconType”(它是一种类型,而不是属性)

(这甚至可能是唯一的问题,因为我不确定是否真的需要一个dependencyProperty,现在我想起来了)


它在 App.xaml 中正确引用,还有其他一些转换器与它一起。 - Cheng Chen
@Danny:我根据你的问题做了一些思考并进行了编辑 - David
这是一个打字错误!我需要将 DialogIconType 更改为 IconType!谢谢! - Cheng Chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接