获取由拉伸值统一

时间:2015-05-21 05:36:04

标签: wpf xaml background padding imagebrush

WPF UI元素定义了宽度和高度,背景设置为图像画笔,并在运行时将图像源指向一些随机图像。拉伸属性未设置,因此我假设它是默认值"填充"发挥作用。由于控制尺寸和图像尺寸不同,在运行时,背景图像画笔填充一些纵横比,即在控件内部填充(视觉上)。有没有办法获得这个填充值?

示例代码:

<Grid Width="2000" Height="2000">
<ListBox>
    <ListBox.Background>
        <ImageBrush ImageSource="{Binding Source={x:Static local:MyModel.Instance},Path=ImageSource,Converter={StaticResource pathImageConverter}}" />
    </ListBox.Background>
</ListBox>
</Grid>

如果我使用颜色而不是图像画笔,它会填充整个区域。但是如果我使用的图像说5000 * 4000尺寸,它会稍微伸展以填充空间(没有倾斜和裁剪)。这不是真正的填充,从视觉上我们觉得列表框边界和图像边界有一个填充。让我试着快照一下。

2 个答案:

答案 0 :(得分:1)

有多种工具可以获取这些值,以及在运行应用程序时分配它们的位置:

可能更多,但这些是我遇到像你这样的问题时使用的。

答案 1 :(得分:1)

没有API来获取这些值,我担心您需要自己进行计算。让我详细说明......

如评论中所示,ImageBrush不会导致您的填充。画笔将简单地绘制它所获得的区域。当然,根据ImageBrush的模式,它不会绘制整个区域,而只是一部分。将画笔更改为SolidColorBrush将显示画笔将获得的整个区域。这应该与图像画笔填充的区域相同,如果它被放入......好,Fill模式。

然而,我非常怀疑它是刷子,而是ControlTemplate的{​​{1}}。如果您在Aero主题中运行,默认情况下,模板以ListBox开头,其Border属性模板绑定回Background,并执行与ListBox相同(并且更糟糕的是,它也有一个固定的填充为1,但是,背景是在其上绘制的。)

所以计算&#34;填充&#34;在刷子上,您需要the same执行BorderThicknessBorder + BorderThickness

但是,如果您在其他主题中运行,或者您的控件已重新设置,那么您的控件模板可能会有所不同,并且计算可能会有所不同......