Как я могу использовать ContentPresenter для отображения BitmapImage в пользовательском элементе управления?

Я новичок в этом. Я пытаюсь создать собственный элемент управления в WPF, который будет отображать изображение и фрагмент текста под ним. Я загружаю изображение с URL-адреса как тип BitmapImage. У меня есть в моем пользовательском интерфейсе, чтобы проверить, правильно ли он загружается, и это так. Он загружается и отображается в , но в пользовательском элементе управления свойство зависимостей Icon просто отображает URL-адрес (который, как я предполагаю, является ToString() того, что он видит).

Вот как это выглядит с работающим полем СЛЕВА, которое я использую только для подтверждения того, что изображение поступает правильно, и неисправным GameIconControl справа:

http://i.imgur.com/heLcUMc.png

Вот Generic.xaml для элемента управления

<Style TargetType="{x:Type assets:GameIconControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type assets:GameIconControl}">
                <Border Background="Transparent"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <StackPanel HorizontalAlignment="Center"
                                VerticalAlignment="Center"
                                Orientation="Vertical">

                            <ContentPresenter Height="Auto"
                                              Margin="3"
                                              ContentSource="Icon"
                                              HorizontalAlignment="Center"/>
                            <ContentPresenter Height="Auto"
                                              Margin="3"
                                              ContentSource="GameName"
                                              HorizontalAlignment="Center"/>
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

А вот C# в GameIconControl.cs

public class GameIconControl : Control
{
    static GameIconControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(GameIconControl), new FrameworkPropertyMetadata(typeof(GameIconControl)));
    }

    public GameIconControl(){}

    public GameIconControl(string name, BitmapImage icon)
    {
        Icon = icon;
        GameName = name;
    }

    public const string IconPropertyName = "Icon";
    public const string GameNamePropertyName = "GameName";

    public string GameName
    {
        get { return (string)GetValue(GameNameProperty); }
        set { SetValue(GameNameProperty, value); }
    }


    public static readonly DependencyProperty GameNameProperty =
        DependencyProperty.Register(GameNamePropertyName, typeof(string), typeof(GameIconControl), new UIPropertyMetadata(default(string)));



    public BitmapImage Icon
    {
        get { return (BitmapImage)GetValue(IconProperty); }
        set { SetValue(IconProperty, value); }
    }

    public static readonly DependencyProperty IconProperty =
        DependencyProperty.Register(IconPropertyName, typeof(BitmapImage), typeof(GameIconControl), new PropertyMetadata(default(BitmapImage)));



}

Что мне не хватает?


person CubemonkeyNYC    schedule 20.01.2014    source источник


Ответы (2)


Я бы рекомендовал использовать Image для представления свойства Icon, а не ContentPresenter. Привяжите свойство Icon к Image.Source, и оно должно работать.

person Erik    schedule 20.01.2014

Вы должны просто иметь возможность использовать свойство ImageSource для привязки к свойству Image.Source для его отображения:

public ImageSource Icon
{
    get { return (ImageSource)GetValue(IconProperty); }
    set { SetValue(IconProperty, value); }
}

public static readonly DependencyProperty IconProperty =
    DependencyProperty.Register(IconPropertyName, typeof(ImageSource), 
    typeof(GameIconControl), new PropertyMetadata(null));

...

Icon = new BitmapImage(new Uri("C:\\Image.jpg"));

...

<Image Source="{TemplateBinding Icon}" />

Хотя, если вы просто хотите отображать изображения, вам даже не нужно использовать тип данных ImageSource... вы можете просто использовать пути string:

Icon = "C:\\Image.jpg";

or

Icon = "/YourAppName;component/ImageFolderName/ImageName.jpg";

...

<Image Source="{TemplateBinding Icon}" />
person Sheridan    schedule 20.01.2014
comment
Должен быть TemplateBinding в ControlTemplate. - person Clemens; 21.01.2014