【问题标题】:Drawing Image wrong size WPF绘图图像大小错误 WPF
【发布时间】:2013-11-08 01:38:00
【问题描述】:

我正在地图上绘制单元格墙,但它的大小错误。我在调试器中检查了图像的高度,它与正确的 cellSize 大小相同,但在视觉上它看起来更短,并且它的开头没有绘制在正确的位置。就像它被画在两端的顶部一样。当我更改图像的高度属性时,它不会使图像变大。这不是如何设置图像大小的高度和宽度吗?

这里是代码。

private void calculateWall(int wall, int cell)
        {
            int[] mapData = this.getMapData(cell);
            int startOfCol = mapData[0];
            int endOfCol = mapData[1];
            int startOfRow = mapData[2];
            int endOfRow = mapData[3];
            CellSide rightSide = this.getCells()[cell].myRightWall;
            CellSide bottomSide = this.getCells()[cell].myBottomWall;

            float thickness = myMap.myCellSize * (float)0.1;
            Math.Round(thickness, 0);
            int newThickness = Convert.ToInt32(thickness);

            float height = myMap.myCellSize * (float)0.2;
            Math.Round(height, 0);
            int newHeight = Convert.ToInt32(height);

            if (rightSide.hasWall == 1)
            {
                Image verticalWall = new Image();

                // Create source.
                BitmapImage bi = new BitmapImage();

                // BitmapImage.UriSource must be in a BeginInit/EndInit block.
                bi.BeginInit();
                bi.UriSource = new Uri("verticalWall.jpg", UriKind.RelativeOrAbsolute);
                bi.EndInit();

                // Set the image source.
                verticalWall.Source = bi;

                verticalWall.Width = newThickness;
                verticalWall.Height = myMap.myCellSize;
                verticalWall.SetValue(Canvas.TopProperty, Convert.ToDouble(startOfRow));
                verticalWall.SetValue(Canvas.LeftProperty, Convert.ToDouble(endOfCol - (newThickness / 2)));

                verticalWall.IsHitTestVisible = false;
                this.view.pbxMap.Children.Add(verticalWall);
            }

【问题讨论】:

  • 不要在 WPF 的过程代码中创建或操作 UI 元素。这就是 XAML 的用途。创建一个合适的 ViewModel 并为此使用 ItemsControl
  • @HighCore 我在鼠标点击时动态添加和删除墙。在我的 winforms 版本中,这种技术没有问题。
  • WinForms 不是 WPF,无论如何,我实际上对您正在做的事情很感兴趣(例如,希望看到最终结果 :)
  • @Noctis 是的,但我也一直在 WPF 中以编程方式绘制墙壁以及其他图像,以这种方式,它已经工作了,所以我更愿意这样做,但是奇怪的是这次它怎么不工作了。太好了,如果你喜欢,我可以在完成后给你 github url :)
  • @user2602079 这样做:)。抱歉,我无法提供更多帮助。话虽如此,使用 XAML 和绑定来处理点击有什么问题?有时在 XAML 中而不是在代码中做事情更容易和更短......

标签: c# wpf image height


【解决方案1】:

关于您在 cmets 中的最后一个问题。

好的,这是我如何构建您的项目的屏幕截图:屏幕截图

现在,无论您在何处使用任何图片,都必须将文件夹添加到该路径:

Source="exit.png"

会变成:

Source="/Images/exit.png"

这个:

<Page.Background>
    <ImageBrush ImageSource="marbleBackground.jpg"/>
</Page.Background>

会变成:

<Page.Background>
    <ImageBrush ImageSource="/Images/marbleBackground.jpg"/>
</Page.Background>

等等...问题解决了:)

【讨论】:

  • 非常感谢!那么,您没有更改任何有关移动 .cs 文件的路径吗?这对我造成了错误,但如果你当时就这样做了,那么我一定能够做到。
  • 不。刚刚创建了文件夹并将它们拖进来......我正要建议一些版本控制,但你正在使用 GIT,所以无论如何你都有备份。随意尝试:)
  • 谢谢 :) 是的,我正在使用 Git,但有时我会出于各种原因创建新的存储库,我有大约 10 个存储库可以生成最终产品。我不擅长在 git repo 中访问以前的版本。但我不能在阳光下问你每一个问题,你帮了很多忙!谢谢,我会试试的:-)
  • 没错,没错……你总是可以压缩你的解决方案,然后摆弄它。如果它不起作用,请从 zip 中恢复。我正在使用并且很满意的另一个选项是tortoisesvn。如果您觉得这有帮助并且回答了您的问题,您也可以将其标记为解决方案。
  • 好的,谢谢 :) 是的,这很有帮助,我可能会暂时不回答这个问题,看看是否有人在不将我的程序架构更改为 MVVM 的情况下对我的代码有解决方案,但我知道我应该,但是我不会:PI没有时间。不过非常感谢!
【解决方案2】:

当您以编程方式在 WPF 中绘制图像时,其拉伸属性默认设置为统一。添加这一行:

verticalWall.Stretch = Stretch.Fill;

现在即使拉伸不均匀,它也会正确调整大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多