WPF图像源绑定有时有时不工作

时间:2016-03-05 16:52:36

标签: c# wpf xaml binding

尝试绑定Image Source时遇到了一些问题。我正在创建一个棋盘游戏,您可以选择一个玩家来查看其属性(包括他的图像)。电路板上的字段也有图像作为背景。

我为字段创建的模板:

<ControlTemplate x:Key="fieldButtonTemplate" x:Name="fieldButtonTemplateName" TargetType="{x:Type Button}">
    <Grid x:Name="fieldGrid" Visibility="Visible">
        <Grid.LayoutTransform>
            <RotateTransform Angle="{Binding ImageRotate}" />
        </Grid.LayoutTransform>
        <Grid.Background>
            <ImageBrush ImageSource="{Binding Path=ImageSource}"/>
        </Grid.Background>
        <Grid.RowDefinitions>
            ....
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
          ...
        </Grid.ColumnDefinitions>
    </Grid>
</ControlTemplate>

用于查看玩家属性的那个:

<Image Source="{Binding Path=CurrentlySelected.ImageSource}" Grid.Column="0" Grid.Row="0"
                   Grid.ColumnSpan="2"  Stretch="Fill" />
<StackPanel x:Name="CurrentPlayerStackPanel"  Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2">
      <TextBlock Text="{Binding Path=CurrentlySelected.Name}" TextWrapping="Wrap"
                           FontFamily="Magneto" FontSize="20" Foreground="BlanchedAlmond"/>
      <TextBlock Text="{Binding Path=CurrentlySelected.Character}" TextWrapping="Wrap"
                           FontFamily="Magneto" FontSize="20" Foreground="BlanchedAlmond"/>
      <TextBlock Text="{Binding Path=CurrentlySelected.Money}" TextWrapping="Wrap"
                           FontFamily="Magneto" FontSize="20" Foreground="BlanchedAlmond"/>
</StackPanel>

问题是图像仅在选择播放器时显示,并且不显示为网格的背景。 我为玩家和领域创建了一个界面:

interface IVisualObject
{
    int ImageRotate { get; set; }
    string ImageSource { get; set; }
}

图像是资源,构建操作设置为内容,复制到输出目录设置为复制(如果较新)。我试图作为图像源传递的字符串就像

  

&#34;包:// siteoforigin:,,, /资源/ picture.jpg&#34;

btw ImageRotate绑定得很好。 提前谢谢!

编辑: 如果我把它设置为

<Grid.Background>
     <ImageBrush ImageSource="pack://siteoforigin:,,,/Resources/picture.jpg"/>
</Grid.Background>

它有效。

2 个答案:

答案 0 :(得分:1)

我可以看到你尝试将ImageBrush.ImageSource绑定到资源。

我在Cannot set ImageSource using pack URI的stackoverflow回答中找到了,我认为这是你的情况。

请注意接下来的回答:

  

...请注意,如果将图像添加到Resource.resx,Visual Studio将为每个图像生成一个包含静态属性的Resources类。   这些属性的类型为System.Drawing.Bitmap,即WinForms,   不是WPF

已更新:您还可以使用转换器更准确地检索资源。

public class StringToImageSource: IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            string resourceName = value.ToString();

            var img = new BitmapImage();
            img.UriSource = new Uri("Resources/" + resourceName);

            return img;
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
}

答案 1 :(得分:1)

使您的属性成为ImageSource而不是字符串,或使用此答案中提到的转换器:Binding image source through property in wpf。当您对字符串进行硬编码时,xaml编译器正在为您执行此操作,这就是为什么这样做。