Преобразователь привязки источника изображений Imagebrush - PullRequest
0 голосов
/ 29 октября 2011

Я использую XML как источник моего приложения через связывание.в xml есть список папок и путь к образцу изображения для каждой папки.Список папок привязывается к списку, а другой дисплей привязывается к выбранному элементу списка, который является элементом списка xml (тип XmlNode).Я добавил возможность добавлять и удалять элементы, используя XmlDocument, который был скопирован из xml XmlProvider и сохранен в исходном файле.

Проблема начинается, когда список источников пуст, либо при загрузке приложениявремя или после удаления всех предметов.в этот момент все связанные с дисплеем значения дисплея равны нулю.Я решил все привязки с помощью свойства привязки TargetNullValue, за исключением свойства image_source фонового изображения canvas, которое ничего не показывает.

Я пытался использовать конвертер, но когда отлаживал его, я видел что-то странное.если в списке были элементы, преобразователь возвращал то, что должен, и изображение отображалось, но если список был пуст, преобразователь возвращал то, что должен, и изображение не отображалось!Пожалуйста, помогите мне.

Код:

XML:

  <Folders>
    <Folder Id="1">
      <Path>folder3\1</Path>
      <SampleImage>C:\images\2011-09-22\site3\1\6.jpg</SampleImage>
    </Folder>
  </Folders>

XAML:

    <Canvas.Background>
      <ImageBrush x:Name="SampleImage" Stretch="Uniform" >
        <ImageBrush.ImageSource>
          <MultiBinding Converter="{StaticResource ImageConverter}" Mode="OneWay">
            <Binding XPath="./SampleImage" />
            <Binding Source="C:\images\SampleImages\no_image.jpg"/>
          </MultiBinding>
        </ImageBrush.ImageSource>
      </ImageBrush>
   </Canvas.Background>

c #:

public class ImageConverter : IMultiValueConverter
{
    public object Convert(object[] value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        ImageSourceConverter imageConverter = new ImageSourceConverter();
        bool bool1=value[0].Equals(DependencyProperty.UnsetValue);
        if (value[0] != null &&!bool1) //if the source isn't null
        {
             //this works fine
             return imageConverter.ConvertFromString(value[0].ToString());
        }
        //here the converter returns the right object but the alternate image isn't shown and the background left blank
        return imageConverter.ConvertFromString(value[1].ToString());

        //here too the converter returns the right object but the alternate image isn't shown and the background left blank
        //return imageConverter.ConvertFromString(@"C:\images\SampleImages\no_image.jpg");

    }


    public object[] ConvertBack(object value, Type[] targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }

}

1 Ответ

0 голосов
/ 30 октября 2011

Вы вызываете метод для одного из значений до , проверяя его на ноль:

bool bool1=value[0].Equals(DependencyProperty.UnsetValue);
if (value[0] != null &&!bool1)

Это только один из возможных источников ошибок. Конечно, пути к файлам должны быть правильными, как уже указал Кент Бугаарт. Далее: "это не работает" не полезно, если вы хотите получить хорошие ответы, предоставьте как можно больше информации. то есть, что именно произошло и что вы ожидали, и как эти ожидания не оправдались.


Кстати, конвертер можно сжать до следующего:

string path = (value[0] is string && value[0] != null) ?
    (string)value[0] : (string)value[1];
return new ImageSourceConverter().ConvertFromString(path);

Вполне возможно, все еще не идеально, но менее загромождено.


Редактировать: Поскольку код работает для меня, я подозреваю, что виноват макет, если нет элементов, которые ваш элемент управления, возможно, больше не занимает, поэтому делает изображение невидимым. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...