Привязка Uri для изображения в FrameworkElementFactory

Я создаю DataTemplate в коде и не могу использовать XAML. :(

Мне удалось создать изображение внутри шаблона, но только если я жестко задал путь к файлу ico. Я хотел бы иметь возможность привязать эту строку к элементу (я использую DataTemplate в модифицированном ListView).

Вот мой код прямо сейчас:

private DataTemplate CreateDataTemplate(string binding, HorizontalAlignment alignment, bool active, bool useIcon)
{
    DataTemplate dt = new DataTemplate();

    FrameworkElementFactory sp = new FrameworkElementFactory(typeof(StackPanel));
    sp.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);

    if (useIcon)
    {
        double size = 14.0;
        BitmapImage bmp = new BitmapImage(new Uri("MyIcon.ico", UriKind.RelativeOrAbsolute));

        FrameworkElementFactory icon = new FrameworkElementFactory(typeof(Image));
        icon.SetValue(Image.SourceProperty, bmp);
        icon.SetValue(Image.WidthProperty, size);
        icon.SetValue(Image.HeightProperty, size);
        icon.SetValue(Image.MarginProperty, new Thickness(0, 0, 5, 0));
        sp.AppendChild(icon);
    }

    FrameworkElementFactory tb = new FrameworkElementFactory(typeof(TextBlock));
    tb.SetBinding(TextBlock.TextProperty, new Binding(binding));
    tb.SetValue(TextBlock.ForegroundProperty, (active ? Brushes.Black : Brushes.Gray));
    tb.SetValue(TextBlock.TextTrimmingProperty, TextTrimming.CharacterEllipsis);
    tb.SetValue(TextBlock.HorizontalAlignmentProperty, alignment);
    sp.AppendChild(tb);

    dt.VisualTree = sp;
    return dt;
}

Спасибо!


person ephracis    schedule 06.06.2011    source источник
comment
Каждый раз, когда вы используете FrameworkElementFactories, симпатичного котенка убивают. (Не могли бы вы объяснить мне, почему вы не можете использовать XAML?)   -  person H.B.    schedule 07.06.2011
comment
У меня есть модифицированный ListView, который можно найти по адресу dev.stoffiplayer.com/source/browse/trunk/Application/GUI/Controls/ViewDetails.xaml и dev.stoffiplayer.com/source/browse/trunk/Application/GUI/Controls/. ViewDetails.xaml.cs В нем я создаю столбцы динамически (т. е. они не жестко закодированы), и мне нужно применить DataTemplate к каждому свойству CellTemplate столбца. Поскольку я не знаю полей базовых элементов или привязок, мне нужно сделать это в коде, а не в XAML. Если у вас есть предложение сделать код красивее, я буду рад его услышать. :)   -  person ephracis    schedule 12.06.2011
comment
Я не могу использовать FrameWorkElementFactory в своей Visual Studio 2012 для Windows Phone8. Эта конкретная функциональность доступна только для Ultimate версии????   -  person SaravanaKumar    schedule 25.10.2013


Ответы (2)


Я полагаю, что ValueConverter может работать.

public class StringToBitmapImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string uristring = value as string;
        return new BitmapImage(new Uri(uristring, UriKind.RelativeOrAbsolute));
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}
icon.SetBinding(Image.SourceProperty, new Binding(path) { Converter = new StringToBitmapImageConverter() });

Где path — это путь к свойству, указывающий на свойство, содержащее строку uri в шаблонном объекте.

person H.B.    schedule 06.06.2011
comment
Выглядит отлично. Я скоро проверю. Один вопрос: обновит ли это изображение, если свойство будет изменено? - person ephracis; 12.06.2011
comment
@HB Я не могу использовать FrameWorkElementFactory в своей Visual Studio 2012 для Windows Phone8. Эта конкретная функциональность доступна только для Ultimate версии???? - person SaravanaKumar; 25.10.2013
comment
@ Seven007: 1. FrameworkElementFactory является частью .NET, которая не имеет ничего общего с программным обеспечением IDE. 2. Windows Phone использует подмножество того, что есть в настольной версии WPF. 3. Вы не должны пытаться использовать FrameWorkElementFactory в любом случае, потому что это устарело. - person H.B.; 26.10.2013

IValueConverter - это решение здесь. Однако обратите внимание на синтаксис пакета URI! Если изображение не является частью вашего решения, ваш метод Convert должен выглядеть так:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
   return "pack://siteoforigin:,,,/" + (string)value;
}

Обратите внимание, что файлы изображений должны находиться в том же каталоге, что и двоичные файлы вашего приложения, или в его подкаталоге, поскольку ведущие "../" будут удалены автоматически.

person user1412631    schedule 03.09.2013