Wpf图像未加载,源问题

时间:2014-08-15 13:45:37

标签: wpf binding datatemplate imagesource

我正在尝试将图像源绑定到字符串。我已经尝试了通过谷歌搜索找到的所有内容,但仍然无法正常工作。  我的方案是,我的项目中有一个Icon文件夹,里面有一些图标。我正在使用像这样的项目控件

  <ItemsControl ItemsSource="{Binding Options}" ItemTemplate="{StaticResource subOptions}" VerticalContentAlignment="Top" >
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>

现在我的数据模板看起来像这样

<DataTemplate x:Key="subOptions">
        <StackPanel>
            <TextBlock Text="{Binding Title}" Foreground="White" FontSize="32" Margin="20,10,0,0" Name="TitleTexBlock"/>
            <Border Width="530" Margin="20,10,0,0" Height="200">
                <!--<Image Source="{Binding IconSource, Converter={StaticResource convertStringToImage}}" Width="100" Height="100"/>-->
                <Image Source="{Binding ImageSource}" Width="100" Height="100"/>

                 <!--<TextBlock Text="{Binding ImageSource}" FontSize="30"/>-->
                <Border.Style>
                    <Style TargetType="Border">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=TitleTexBlock,Path=Text}" Value="Defaults">
                                <Setter Property="Background" Value="Green"/>
                            </DataTrigger>
                        </Style.Triggers>
                        <Setter Property="Background" Value="DarkRed"/>
                    </Style>
                </Border.Style>
            </Border>
            <ListBox ItemsSource="{Binding Suboptions}" SelectedItem="{Binding ElementName=Options,Path=DataContext.SelectedSuboption}"   ItemTemplate="{StaticResource Inside}" Padding="10,10,10,10" Margin="20,0,0,0" BorderThickness="0">
                <ListBox.Resources>
                    <Style TargetType="ListBox">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Title}" Value="Defaults">
                                <Setter Property="Background" Value="Green"/>
                            </DataTrigger>
                        </Style.Triggers>
                        <Setter Property="Background" Value="DarkRed"/>
                    </Style>
                </ListBox.Resources>
                <ListBox.ItemContainerStyle>
                    <Style TargetType="ListBoxItem">
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Foreground" Value="LightGreen"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </ListBox.ItemContainerStyle>
            </ListBox>
        </StackPanel>
    </DataTemplate>

现在注释掉的图像正在使用此转换器

public class ImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return new BitmapImage(new Uri(value.ToString(), UriKind.RelativeOrAbsolute)); 
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new System.NotImplementedException();
    }
}

转换器的价值来自此处

public class Option
{
    public string Title { get; set; }

    private string iconSource = "/Icons/";

    //private string iconSource = "pack://application:,,,MoveA2Options;components/Icons/";
    public string IconSource
    {
        get { return iconSource; }
        set
        {
            iconSource = iconSource + value;
            iconSource += ".png";
        }
    }

我知道创建的路径是正确的,因为我尝试使用在Xaml中注释掉的Texblock并显示正确的路径。 我也试过这种方法

public class Option
{
    public string Title { get; set; }

    private string iconSource = "/Icons/";

    //private string iconSource = "pack://application:,,,MoveA2Options;components/Icons/";
    public string IconSource
    {
        get { return iconSource; }
        set
        {
            iconSource = iconSource + value;
            iconSource += ".png";
            imageSource = new BitmapImage(new Uri((iconSource), UriKind.RelativeOrAbsolute));
        }
    }

    private ImageSource imageSource;
    public ImageSource ImageSource
    {
        get { return imageSource; }
        set { imageSource = value; }
    } 

因此,在这种方法中,不使用转换器,文本块再次显示图像的路径是正确的。但图像要么没有显示,要么我得到一些输出异常。 使用这样的任何图像

<Image Source="pack://application:,,,MoveA2Options;components/Icons/CrateHire.png"></Image>

或者这个

<Image Source="/Icons/CrateHire.png"></Image>

完美无缺,任何我可以尝试解决的想法?处理的DataTemplate中的图像是否与网格中的图像不同?

亲切的问候

1 个答案:

答案 0 :(得分:1)

我在我的情况中找到的唯一解决方案是修改此行

 private string iconSource = "/Icons/";

到这个

  private string iconSource = "../Icons/";