Шаблон кнопки с изображением и текстом в 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, но пока не удалось из-за отсутствия очков и отказался от редактирования ответа Шона.