2016-03-05 2 views
2

У меня возникла проблема при попытке связать источник изображения. Я создаю настольную игру, в которой вы можете выбрать игрока для просмотра его атрибутов (включая его образ). Также поля на доске имеют изображения в качестве фона.WPF 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; } 
} 

Изображения ресурсов, строить действие, установленное для содержания и скопировать в каталог вывода устанавливается для копирования, если новее. Строка я пытаюсь передать в качестве источника изображения, как

"пакет: // siteoforigin: ,,,/Ресурсы/picture.jpg"

кстати ImageRotate является переплетены просто отлично. Спасибо заранее!

EDIT: если я установить его как

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

это работает.

+0

(сторона примечания) вы уверены, что не хотите // приложение: и нести изображения в том же каталоге, что и ваш exe? все еще думая о вашем первоначальном вопросе ... у вас есть кнопка targettype ... где кнопка? –

+0

Почему это было бы лучше? этот шаблон находится в другом файле xaml, чем сама кнопка, я не думал, что это важно для вопроса, поскольку, если я заменю источник изображения внешним источником (например, c: \ something \ testField.jpg), он отлично работает , –

+0

работает RotateTransform, но изображения нет? –

ответ

1

Сделайте свою собственность ImageSource и не строка, или использовать преобразователь, как упомянуто в этом ответе: Binding image source through property in wpf. Когда вы жестко кодируете строку, компилятор xaml делает это для вас, поэтому это работает.

+0

Спасибо! При этом я обнаружил, что сделал ошибку noob, поэтому я принимаю ваш ответ. –

1

Я вижу, что вы пытаетесь связать ImageBrush.ImageSource с ресурсом.

Я нашел ответ на stackoverflow для Cannot set ImageSource using pack URI, и я думаю, что это ваш случай.

Обратите внимание на следующий в ответ:

... Пожалуйста, обратите внимание, что при добавлении изображений в Resource.resx, Visual Studio генерирует класс ресурсов со статическими свойствами для каждого изображения. Эти свойства типа 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(); 
     } 
} 
+0

К сожалению, это не так. также я просмотрел ссылки в этом вопросе, ни одна из них не решила мою проблему. –

+0

Возможно, вы можете попробовать использовать свой URI в xaml напрямую. И после сделайте какой-то вывод по причине. – Anton

+0

проблема с этим - я хотел бы установить другое изображение для каждого поля –