Пользовательский элемент управления Silverlight ImageButton

Я только начинаю работать с Silverlight (2 RC0) и, похоже, не могу заставить работать следующее. Я хочу создать простой пользовательский элемент управления кнопкой изображения.

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

 <Button>
        <Button.Template>   
            <ControlTemplate>
                <Image Source="{TemplateBinding ImageSource}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" />
            </ControlTemplate>
        </Button.Template>
    </Button>

Код позади выглядит следующим образом:

public partial class ImageButtonUserControl : UserControl
    {
        public ImageButtonUserControl()
        {
            InitializeComponent();
        }

        public Image Source
        {
            get { return base.GetValue(SourceProperty) as Image; }
            set { base.SetValue(SourceProperty, value); }
        }
        public static readonly DependencyProperty SourceProperty = 
            DependencyProperty.Register("SourceProperty", typeof(Image), typeof(ImageButtonUserControl),null);
    }

Я хочу иметь возможность динамически создавать ImageButtons и помещать их в контейнер, например WrapPanel: Предположим, у нас уже есть изображение с именем «image»:

ImageButtonUserControl imageButton = new ImageButtonUserControl();
imageButton.Source = image;
this.thumbnailStackPanel.Children.Add(imageButton);

Что мне нужно сделать, чтобы изображение отображалось? Я предполагаю, что мне нужно что-то сделать с DataContext, но я не совсем уверен, что и где.

Спасибо за любую помощь


person ckarbass    schedule 14.10.2008    source источник


Ответы (2)


Вы можете легко получить ImageButton, просто создав шаблон для обычной кнопки, поэтому вам вообще не требуется UserControl. Предполагая, что Button.Content будет ImageSource. ControlTemplate кнопки будет:

 <ControlTemplate x:Key="btn_template">         
   <Image Source="{TemplateBinding Content}" />   
 </ControlTemplate>

И использование в качестве ItemsControl с коллекцией URL-адресов в качестве ItemsSource, вы можете добавить WrapPanel в качестве ItemPanel. Если вы его не укажете, по умолчанию будет StackPanel.

<DataTemplate x:Key="dataTemplate">
  <Button Template="{StaticResource btn_template}" Content="{Binding}"/>
</DataTemplate>    


 <ItemsControl ItemsSource="{Binding UrlCollection}" ItemsTemplate="{StaticResource dataTemplate}"/>
person Community    schedule 14.10.2008
comment
хм ... у него уже есть ширина и высота, я думаю, это связано с DataContext ... - person ckarbass; 14.10.2008
comment
это использование приведет к появлению кнопки с изображением внутри. Мне нужно интерактивное изображение (без кнопки по умолчанию, визуально инкапсулирующей его) .... Я считаю, что приведенный выше код полностью переопределяет шаблон кнопки по умолчанию с изображением. - person ckarbass; 14.10.2008
comment
Нет, это именно то, что вам нужно. На нем не будет отображаться хромированная кнопка, просто попробуйте. - person Jobi Joy; 14.10.2008
comment
ну, вы только что изменили свой ответ, то, что у вас есть сейчас, переопределит шаблон - person ckarbass; 14.10.2008
comment
но ... у меня есть несколько изображений ... Я получаю список URL-адресов, создаю из них объекты изображений ... затем создаю указанные выше пользовательские элементы управления с изображениями, которые я только что создал, затем добавляю их на панель обтекания - person ckarbass; 14.10.2008
comment
используйте ItemsControl и установите ItemsPanel как WrapPanel, затем дайте кнопке, которую я написал, как ItemTemplate элемента ItemsControl. И ItemsSource будет набором URL-адресов - person Jobi Joy; 14.10.2008

Я верю, что это поможет. Это помогло мне!

http://www.nikhilk.net/Silverlight-Effects-In-Depth.aspx

Вместо Image используйте ImageSource. НАПРИМЕР. typeof (ImageSource) и т. д.

person Community    schedule 12.02.2009