2013-04-05 2 views
1

Я создал очень простой пользовательский элемент управления, ImageButtonCaliburn.micro и UserControl нажмите обработчик

<UserControl x:Class="SampleApp.Controls.ImageButton" 
      Name="ImageButtonControl" 
      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" 
      d:DesignHeight="300" 
      d:DesignWidth="300" 
      mc:Ignorable="d"> 
    <Button> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="1*" /> 
       <RowDefinition Height="6*" /> 
       <RowDefinition Height="2*" /> 
       <RowDefinition Height="1*" /> 
      </Grid.RowDefinitions> 
      <Image Grid.Row="1" Source="{Binding ElementName=ImageButtonControl, Path=Image}" VerticalAlignment="Stretch" HorizontalAlignment="Center" /> 
      <TextBlock Grid.Row="2" Text="{Binding ElementName=ImageButtonControl, Path=Text}" VerticalAlignment="Stretch" HorizontalAlignment="Center" /> 
     </Grid> 
    </Button> 
</UserControl> 

С кодом позади:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 

namespace SampleApp.Controls 
{ 
    /// <summary> 
    /// Interaction logic for ImageButton.xaml 
    /// </summary> 
    public partial class ImageButton : UserControl 
    { 
     public ImageButton() 
     { 
      InitializeComponent(); 
     } 

     public string Text 
     { 
      get { return (string)GetValue(TextProperty); } 
      set { SetValue(TextProperty, value); } 
     } 

     public static readonly DependencyProperty TextProperty = 
      DependencyProperty.Register("Text", typeof(string), typeof(ImageButton), new UIPropertyMetadata("")); 

     public ImageSource Image 
     { 
      get { return (ImageSource)GetValue(ImageProperty); } 
      set { SetValue(ImageProperty, value); } 
     } 

     public static readonly DependencyProperty ImageProperty = 
      DependencyProperty.Register("Image", typeof(ImageSource), typeof(ImageButton), new UIPropertyMetadata(null)); 
    } 
} 

Теперь я хочу использовать это в моем маленьком образце применение как

xmlns:controls="clr-namespace:SampleApp.Controls" 

<controls:ImageButton Grid.Row="1" 
           Grid.Column="1" 
           Margin="2" 
           Image="/Images/link.png" 
           Text="DoSomething"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="Click"> 
        <cal:ActionMessage MethodName="DoSomething" /> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </controls:ImageButton> 

Если я дам ему топор: Имя, как

<controls:ImageButton x:Name="DoSomething" 

например. DoSomething метод DoSomething с этим именем вызывается непосредственно при отображении вида, то есть когда я активирую viewmodel, который содержит эту кнопку, точно так же, как я нажимаю кнопку (если это была обычная кнопка, а не usercontrol), это сработало бы таким образом), но обработчик кнопки не вызывается при нажатии.

Теперь я попытался добавить ActionMessage, как показано выше, но это не работает, либо ...

Что здесь не так?

ответ

2

Это потому, что для вашего пользовательского типа управления не существует соглашения. Вы можете либо добавить соглашение через ConventionManager (см. http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Conventions), либо вы можете получить свой тип от Button.

Вы также не можете использовать пользовательский элемент управления, а вместо этого просто добавить изображение в Content свойство Button на ваш взгляд.

+0

Да, хорошая идея, я стараюсь использовать прикрепленное свойство, чтобы установить изображение для кнопок; таким образом вам не нужно иметь производный элемент управления для создания шаблонной кнопки, вы можете просто применить стиль по умолчанию ко всем кнопкам. Стиль может содержать шаблон, имеющий привязку к этому прикрепленному свойству, поэтому сама кнопка не должна знать об этом - это довольно эффективно (хотя, если я помню, есть некоторые проблемы в дизайнере в VS2010 с привязкой к прикрепленным свойствам - отлично работает во время выполнения) – Charleh

+0

Да, подход работает хорошо, вы также можете сделать добавленное свойство достаточно общим, чтобы оно поддерживало другие свойства, которые можно было бы шаблонировать (например, текст, границу, фон и т. д.), чтобы одно присоединенное свойство можно было повторно использовать на всех кнопках шаблонные стили – devdigital

+0

Большое спасибо, что делает его кнопкой, а пользовательский контроль работает хорошо. Как я могу создать общие приложенные свойства? Я не хочу добавлять изображение к каждой кнопке, потому что хочу более сжатый XAML. –

Смежные вопросы