Я создал очень простой пользовательский элемент управления, 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, как показано выше, но это не работает, либо ...
Что здесь не так?
Да, хорошая идея, я стараюсь использовать прикрепленное свойство, чтобы установить изображение для кнопок; таким образом вам не нужно иметь производный элемент управления для создания шаблонной кнопки, вы можете просто применить стиль по умолчанию ко всем кнопкам. Стиль может содержать шаблон, имеющий привязку к этому прикрепленному свойству, поэтому сама кнопка не должна знать об этом - это довольно эффективно (хотя, если я помню, есть некоторые проблемы в дизайнере в VS2010 с привязкой к прикрепленным свойствам - отлично работает во время выполнения) – Charleh
Да, подход работает хорошо, вы также можете сделать добавленное свойство достаточно общим, чтобы оно поддерживало другие свойства, которые можно было бы шаблонировать (например, текст, границу, фон и т. д.), чтобы одно присоединенное свойство можно было повторно использовать на всех кнопках шаблонные стили – devdigital
Большое спасибо, что делает его кнопкой, а пользовательский контроль работает хорошо. Как я могу создать общие приложенные свойства? Я не хочу добавлять изображение к каждой кнопке, потому что хочу более сжатый XAML. –