【发布时间】:2011-02-13 04:40:36
【问题描述】:
我想创建带有图像和文本的按钮。例如,我会为“浏览文件夹”和“导入”等按钮使用不同的图像和文本。
其中一个选项是使用模板。我看过类似的问题
Creating an image+text button with a control template?
但是有什么方法可以在不使用依赖属性或任何其他类的情况下绑定图像源?
【问题讨论】:
标签: wpf templates binding custom-controls
我想创建带有图像和文本的按钮。例如,我会为“浏览文件夹”和“导入”等按钮使用不同的图像和文本。
其中一个选项是使用模板。我看过类似的问题
Creating an image+text button with a control template?
但是有什么方法可以在不使用依赖属性或任何其他类的情况下绑定图像源?
【问题讨论】:
标签: wpf templates binding custom-controls
不必那么复杂。将 StackPanel 放在按钮中这样简单的事情就可以解决问题:
<Button>
<StackPanel>
<TextBlock>My text here</TextBlock>
<Image Source="some.jpg" Stretch="None" />
</StackPanel>
</Button>
然后你可以配置 StackPanel 来控制文本应该出现的位置、对齐方式等。
【讨论】:
StackPanel 的Orientation 设置为Horizontal 以让它们并排排列。请注意,如果您使用网格而不是 StackPanel,则必须使用边距来使按钮上的图像和文本水平居中(因此堆栈面板是要走的路)。
我添加了一些东西来很好地排列它们
<Button>
<StackPanel Orientation="Horizontal">
<Image Source="/ApplicationName;component/Images/MyImage.ico"/>
<Label Padding="0">My Button Text</Label>
</StackPanel>
</Button>
【讨论】:
HorizontalAlignment="Stretch" 不起作用。附言WPF 是不可预测且愚蠢的。
<Button>
<StackPanel Orientation="Horizontal">
<Image Source="Resources/add.png" Stretch="None" />
<TextBlock Margin="5,0,0,0">Add</TextBlock>
</StackPanel>
</Button>
【讨论】:
<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>
【讨论】:
没有。您会将Image.Source 绑定到什么?为此,您需要一个 DependencyProperty。当然,您也可以定义一个包含两个属性的普通类:Text 和 ImageSource 或 Uri,然后使用 DataTemplate 来呈现此类的实例,但这将是更多的代码编写,并且有点“臭”。
您不想使用依赖属性或自定义类的原因是什么?
【讨论】:
TemplateBinding放在哪里?您将绑定到哪个属性?
在 Sean 的回答中添加了 Stretch="Uniform",以解决如果图像最初大于按钮大小的情况(我也遇到过他的 cmets 中提到的问题 BrainSlugs83)。在MSDN 了解更多关于拉伸选项的详细信息。
<Button>
<StackPanel Orientation="Horizontal">
<Image Source="/ApplicationName;component/Images/MyImage.ico" Stretch="Uniform"/>
<Label Padding="0">My Button Text</Label>
</StackPanel>
</Button>
想将此作为评论添加到 BrainSlugs83 下的答案中,但由于缺少分数而无法编辑 Sean 的答案而被拒绝。
【讨论】:
对我来说,XCeed WPF 工具包(免费软件)的IconButton 可以解决问题。
【讨论】: