Если единственная добавленная функциональность, которую вы хотите для своей кнопки, - это иметь изображение на ней, то я думаю, что вы подходите к этому с неправильной стороны. WPF так же великолепен, как и элементы управления пользовательского интерфейса look-less. Это означает, что элемент управления - это просто определение функциональности + некоторый шаблон для определения его внешнего вида. Это означает, что шаблон может быть заменен в любое время, чтобы изменить внешний вид. Кроме того, практически любой контент может быть помещен внутри практически любого элемента управления
Например, для определения кнопки в вашем xaml, которая будет выглядеть так, как вам нужно, все, что вам нужно, это:
<Window ...>
...
<Button Command="{Binding AttachContextCommand}">
<StackPanel Orientation="Horizontal">
<Image Source="{StaticResource AssociateImage}"/>
<TextBlock Text="Associer"/>
</StackPanel>
</Button>
...
</Window>
Просто помните, что с WPF вам не нужно определять новый CustomControl или UserControl каждый раз, когда вы хотите изменить внешний вид чего-либо. Единственный раз, когда вам нужен CustomControl, это если вы хотите добавить функциональность в существующий элемент управления или создать функциональность, которой нет ни в одном другом элементе управления.
Редактировать Из-за комментария:
Если вы хотите не определять содержимое кнопки каждый раз, другой вариант - просто иметь класс poco (обычный старый объект CLR), который определит все, что вас интересует (я напишу мой пример) как будто вы делаете это для панели инструментов, потому что это имеет смысл для меня):
public class ToolBarItem : INotifyPropertyChanged
{
public string Text { get ... set ... }
public ICommand Command { get ... set ... }
public ImageSource Image { get ... set ... }
}
Здесь определен шаблон данных (App.xaml, Window.Resources и т. Д.):
<DataTemplate DataType="{x:Type l:ToolBarItem}">
<Button Command="{Binding Command}">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Image}"/>
<TextBlock Text="{Binding Text}"/>
</StackPanel>
</Button>
</DataTemplate>
А затем используйте парня в вашем xaml так:
<Window ...>
...
<ContentControl>
<ContentControl.Content>
<l:ToolBarItem Image="..." Command="..." Text="..."/>
</ContentControl.Content>
</ContentControl>
...
</Window>
Я просто не знаю, как вы пытаетесь это сделать - это самый лучший способ, которым вы могли бы это сделать.
РЕДАКТИРОВАТЬ Обновлено на основе второго комментария
Извините, я забыл включить ContentControl вокруг этого. Теперь, когда я вспомнил это, я понял, что это не намного менее многословно, чем оригинал, в котором вы указываете контент вручную. Я отправлю новый ответ, чтобы помочь с вашим первоначальным вопросом.