Шаблон кнопки с изображением и текстом в wpf

Я хочу создать кнопки с изображениями и текстом внутри. Например, я бы использовал разные изображения и текст для таких кнопок, как "Обзор папок" и "Импорт". Один из вариантов - использовать шаблон. Я посмотрел на simliar вопрос

Создание кнопки изображения + текста с шаблоном управления?

Но есть ли способ, с помощью которого я могу связать источник изображения без использования свойства зависимостей или любого другого класса?

Спасибо

Ответ 1

Нет. Что бы вы связали с Image.Source? Для этого вам нужен DependencyProperty. Конечно, вы также можете определить нормальный класс, который содержит два свойства: Text и ImageSource или Uri, а затем использовать DataTemplate для визуализации экземпляров этого класса, но это будет еще больше кода для записи и это немного "вонючий".

В чем причина, по которой вы не хотите использовать свойство зависимости или пользовательский класс?

Ответ 2

Это не должно быть так сложно. Что-то простое, как положить StackPanel внутри кнопки, сделает трюк:

<Button>
  <StackPanel>
    <TextBlock>My text here</TextBlock>
    <Image Source="some.jpg" Stretch="None" />
  </StackPanel>
</Button>

Затем вы можете настроить StackPanel для управления тем, где должен выглядеть текст, выравнивание и т.д.

Ответ 3

Я добавил несколько вещей, чтобы выстроить их хорошо

<Button>
   <StackPanel Orientation="Horizontal">
       <Image Source="/ApplicationName;component/Images/MyImage.ico"/>
       <Label Padding="0">My Button Text</Label>
   </StackPanel>
</Button>

Ответ 4

    <Button>
        <StackPanel Orientation="Horizontal">
            <Image Source="Resources/add.png" Stretch="None" />
            <TextBlock Margin="5,0,0,0">Add</TextBlock>
        </StackPanel>
    </Button>

Ответ 5

<Button x:Name="MyCoolButton"Width="200" Height="75">
<Grid >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Image Source="Pete-Brown-Silverlight-in-Action.png" Margin="5" Grid.Column="0" />
    <StackPanel Grid.Column="1" Margin="5">
        <TextBlock Text="Buy My Book!" FontWeight="Bold" />
        <TextBlock Text="Pete is writing THE Silverlight 4 book" TextWrapping="Wrap" />
    </StackPanel>
</Grid>

Ответ 6

Добавлен Stretch = "Uniform" для ответа Sean на адресный случай, если изображение изначально больше размера кнопки (вопрос BrainSlugs83 упоминается в его комментариях, в которые я столкнулся). Подробнее о параметрах Stretch в MSDN.

<Button>
    <StackPanel Orientation="Horizontal">
        <Image Source="/ApplicationName;component/Images/MyImage.ico" Stretch="Uniform"/>
        <Label Padding="0">My Button Text</Label>
    </StackPanel>
</Button>

Хотелось бы добавить это в качестве комментария к ответу в BrainSlugs83, но пока не удалось из-за отсутствия очков и отказался от редактирования ответа Шона.