Изображение в пользовательском элементе управления Silverlight 4 не устанавливается - PullRequest
0 голосов
/ 15 сентября 2010

У меня есть пользовательский элемент управления Silverlight, в котором есть элемент управления изображением.Это изображение должно быть установлено другой страницей, которая содержит вышеупомянутый элемент управления, через набор данных связанного списка элементов.В настоящее время изображение не устанавливается при отправке URL-адреса в пользовательский элемент управления.На самом деле ни один код, кроме SetValue(ImageSourceProperty, value);, кажется, не работает.

XAML в пользовательском элементе управления выглядит следующим образом:

<Grid x:Name="LayoutRoot" Background="Black">
    <Image Name="ContentImage"/>
</Grid>

В этом коде у меня установлен DependencyObject для получения URL-адреса изображения и установки источника данных изображения:

        public static DependencyProperty ImageSourceProperty =
    DependencyProperty.Register("ImageSource", typeof(String), typeof(MediaItemControl), null);

public String ImageSource
    {
        get { return (String)GetValue(ImageSourceProperty); }
        set
        {
            SetValue(ImageSourceProperty, value);
            Dispatcher.BeginInvoke(() => this.ContentImage.Source = new BitmapImage(new Uri(value, UriKind.RelativeOrAbsolute)));
        }
    }

MainPage.Xaml содержит ссылку на этот пользовательский элемент управления в ItemsTemplate, чей источник данных устанавливается в коде позади списка объектов, у которого есть свойство ImageURL.Этот источник данных правильно установлен в коде позади.Это XAML для главной страницы:

<UserControl x:Class="ExampleSilverlightApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:medc="clr-namespace:ExampleSilverlightApp.Controls" mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
    <StackPanel Name="ItemsControlStackPanel">
        <ItemsControl Name="ContentItemControl" Visibility="Visible">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"  />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid Width="126" HorizontalAlignment="Center">
                        <medc:MediaItemControl x:Name="CustomMediaItemControl"   
                                               ImageSource="{Binding ImageURL}"
                                               >
                        </medc:MediaItemControl>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>
</Grid>

У меня проблема в том, что источник изображения не устанавливается на пользовательском элементе управления.Установщик объекта зависимости, кажется, не поражен.Если я помещаю кнопку в элемент управления, который при нажатии устанавливает свойство ImageSource, затем удаляется набор и отображается изображение.Интересно то, что значение ImageSource действительно установлено правильно, но источник данных изображения является нулевым, пока не будет установлен с помощью кнопки.

У кого-нибудь есть идеи относительно того, почему это происходит?

1 Ответ

1 голос
/ 15 сентября 2010

Попробуйте установить ContentImage.Source в PropertyChangedCallback, делегат свойства Dependency, например:

public static DependencyProperty ImageSourceProperty = 
DependencyProperty.Register("ImageSource", typeof(String), typeof(MediaItemControl), 
    new PropertyMetadata(delegate(DependencyObject sender, DependencyPropertyChangedEventArgs args)
            {
                (sender as MediaItemControl).ContentImage.Source = new BitmapImage(new Uri((string)args.NewValue, UriKind.RelativeOrAbsolute));
            }));

При привязке данных механизм привязки данных в фоновом режиме вызывает DependencyObject.SetValue (ImageSourceProperty, newValue) ине относится к фактической собственности (то есть - он не вызывает MediaItemControl.ImageSource = newValue) - следовательно, логика в установщике не вызывается.

HTH!

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