WPF:使网格适应图像

时间:2017-01-18 08:34:19

标签: c# wpf visual-studio

我知道WPF中的图像可以适合网格。现在还有网格适应图像的可能性吗?

我想使用自动布局在图像上的某些位置放置按钮,但图像保持其原始形状(因此Stretch = Uniform)也很重要。但是,当我首先使用网格的行和列时,按钮就在我想要的位置,但是如果我在宽度而不是高度上拉伸窗口,则按钮会偏离我想要的位置(基于图像)。

我明白要做什么?有谁知道如何实现这一目标?

编辑: 在我的图像上,让我们说一个圆圈,我想要一个按钮,总是靠近圆圈。 好的,这是我到目前为止的代码:

<Window x:Class="VakPumpEntwurf2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid Background="#FFE62626">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="69*" />
        <ColumnDefinition Width="21*"/>
        <ColumnDefinition Width="254*" />
        <ColumnDefinition Width="173*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="55*" />
        <RowDefinition Height="19*"/>
        <RowDefinition Height="33*"/>
        <RowDefinition Height="107*" />
        <RowDefinition Height="107*" />
    </Grid.RowDefinitions>

    <Image Source="images/MyPic.png" Grid.ColumnSpan="4" Grid.RowSpan="5" >  
    </Image>

    <Button Grid.Column="1" Grid.Row="1"/>  //This Button shall be always near the circle
</Grid>

这里还有两张图片我希望更清楚我的问题在哪里:

This is the position I want my button to be regarding the circle

这是我拉伸窗口宽度后按钮的位置。但实际上我希望我的按钮总是非常靠近圆圈。

3 个答案:

答案 0 :(得分:1)

如果要在按钮和圆圈之间保持相同的距离,则应考虑使用“画布”面板而不是“网格”。

Canvas定义了一个区域,您可以使用相对于Canvas区域的坐标显式定位子元素:https://msdn.microsoft.com/en-us/library/system.windows.controls.canvas(v=vs.110).aspx

  

值得一试,但是我仍然可以将Canvas的背景图像设置为Stretch = Uniform吗?

不确定。只需将Canvas的Background属性设置为ImageBrush:

<Canvas>
    <Canvas.Background>
        <ImageBrush ImageSource="bg.png" Stretch="Uniform" />
    </Canvas.Background>
    ...
</Canvas>

答案 1 :(得分:0)

问题是,我认为解决方案在于@ mm8和@Manfred Radlwimmer建议的组合。

以下是为我制定的代码:

<Window x:Class="Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="337" Width="514" Background="AliceBlue">


    <Viewbox>
        <Canvas Width="200" Height="100">
            <Canvas.Background>
                <ImageBrush ImageSource="images/pic1.png" Stretch="Uniform" />
            </Canvas.Background>
            <Button Canvas.Left="30" Content="Howdy" Canvas.Top="5" FontSize="6" Width="25" Height="16"/>
        </Canvas>
    </Viewbox>

</Window>

我可以更好地控制按钮的位置,按钮可以相对于我的图像进行缩放。但正如@Manfred Radlwimmer所说,这就是ViewBox的目的。即使ViewBox对其中的控件的尺寸做了奇怪的事情。

感谢大家的帮助! :)

答案 2 :(得分:0)

让我们使用一些嵌套网格......

<Grid Background="#FFE62626">
    <Grid VerticalAlignment="Center" HorizontalAlignment="Center">
        <Image Source="images/MyPic.png"/>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*" />
                <ColumnDefinition Width="2*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="1*" />
                <RowDefinition Height="2*"/>
            </Grid.RowDefinitions>
            <Button Grid.Row="1" Grid.Column="1" Width="100" Height="50" VerticalAlignment="Top" HorizontalAlignment="Left" Content="Click me 2"/>
        </Grid>
    </Grid>
</Grid>

最外面的网格正在伸展到父容器。第二级网格与其中的均匀拉伸图像大小相同。第3级网格与第二级网格大小相同,并提供比例行/列定义。该按钮位于第3级网格的第2行和第3列的左上角。

老实说,我不能说为什么需要第3级网格而不是第2级的行和列,让图像跨越多行/列,我只尝试了两种布局,只有3级一个按预期工作。