0

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 尺寸的图像,它会稍微拉伸以填充空间(没有倾斜和裁剪)。那不是真正的填充,视觉上我们感觉到列表框边界和图像边界有一个填充。让我尝试对此进行快照。

4

2 回答 2

1

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

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

于 2015-05-21T07:37:52.823 回答
1

没有 API 可以获取这些值,恐怕您需要自己进行计算。让我详细说明...

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

但是,我高度怀疑它是刷子,而是ControlTemplate. ListBox如果您在 Aero 主题中运行,默认情况下,模板以 a 开头,其属性Border模板Background绑定回1,然而,背景是在上面绘制的)。ListBoxBorderThickness

所以要计算画笔的“填充”,你需要做同样的事情BorderBorderThickness+ Padding

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

于 2015-05-22T19:33:18.320 回答