【问题标题】:.NET Window Height Different in Debugger.NET 窗口高度在调试器中不同
【发布时间】:2014-03-09 21:44:41
【问题描述】:

我在 Visual Studio 2013 Express(一个 WPF 应用程序)中用 C# 创建了一个项目。当使用 Visual Studio 中的调试器运行时,应用程序 Window 显示正确的大小,但是当从 bin 文件夹运行相同的生成可执行文件时,窗口大约高 5-7px。值得一提的是Window.Height是由底层代码动态控制的。

也就是说,为什么在运行时大小会有所不同?我是 Windows 开发新手。

这是我调整大小的代码:

const int WindowBaseHeight = 94;
const int ItemHeight = 68;
ObservableCollection<obj> CurrentItems = new ObservableCollection<obj>();

AppWindow.Height = WindowBaseHeight + ItemHeight * CurrentItems.Count;

【问题讨论】:

  • 你能展示你的代码来调整窗口大小吗?
  • @Adam 好了,相关部分已添加。
  • 您似乎正在根据您收藏中的物品数量来改变您的身高。您的收藏是否有可能超出您的预期?
  • @Adam 不,我不这么认为。高度差会更大,另外还有一个事实是它在 Visual Studio 中运行时可以完美运行。在 Visual Studio 之外运行时,差异肯定小于 10 像素。
  • 您的代码没有意义。如果CurrentItems.Count 是 25 亿呢?你会有一个窗口2.5b * itemheight 高吗?

标签: c# .net wpf .net-4.0 visual-studio-2013


【解决方案1】:

好的。深呼吸,然后删除您的代码并重新开始。

首先,如果您正在使用 WPF,则需要摒弃您可能习惯于其他技术的所有方法,并理解和接受The WPF Mentality

基本上,您无需对布局进行任何操作,也无需手动调整 UI 元素的大小,也无需在程序代码中进行类似操作,因为 WPF 默认为 Resolution Independent,它提供了多种机制来创建可自动调整的布局和无论可用的屏幕/窗口大小如何,用户界面都能完美契合。

为了使窗口自动调整到其内容的大小,您必须相应地设置Window.SizeToContent 属性。

您需要了解的另一个非常重要的方面是,在 WPF 中,任何显示“项目”的 UI(任何显示 2 个或多个相同“事物”的 UI,无论“事物”是什么)都应该被实现使用ItemsControl

这是在 WPF 中创建基于项目的自动调整 UI 的方式,其中项目的高度为 68:

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" SizeToContent="Height" Width="200">
    <ItemsControl ItemsSource="{Binding}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid Height="68" Background="LightCyan">
                    <TextBlock Text="{Binding}" 
                               VerticalAlignment="Center" 
                               HorizontalAlignment="Center"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>

后面的代码(为了示例):

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        DataContext = Enumerable.Range(0, 4).Select(x => "Item" + x.ToString());
    }
}

结果:

  • 请注意我如何使用 ItemsControl 和 DataBinding 它是 ItemsSource 属性,以便在适当的 XAML 中以声明方式定义 UI,而不是在程序上创建 代码中的 UI。这是 WPF 中一切的首选方法。

  • 这种方法将代码延迟减少到几乎为零。正如您在我的示例中看到的,我所做的只是将 Window 的 DataContext 设置为可用于 DataBinding 的相关数据。

  • 另外请注意,没有任何代码对 UI 进行任何操作。 Window大小由WPF根据SizeToContent属性的值设置,该属性设置为Height

  • 为了示例,我绑定到 List&lt;string&gt;,但您可以数据绑定到 WPF 中任何类型的 .Net 对象,甚至是 directly to XML

  • WPF Rocks。 - 只需将我的代码复制并粘贴到 File -&gt; New Project -&gt; WPF Application 中,然后自己查看结果。

  • 我建议您阅读这篇文章中的链接材料,最重要的是“WPF Mentality”文章、DataBinding 概述和ItemsControl 系列。如果您需要进一步的帮助,请告诉我。

【讨论】:

  • 哦!谢谢你的好答案。我已经在使用ItemsControl,所以我认为这个我不知道的Window.SizeToContent 属性绝对是我应该使用的。我还在习惯 WPF,但我相信这会帮助我以正确的方式做事。
  • 是的!果然,这解决了我的不一致问题。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 2018-07-29
  • 2013-07-23
相关资源
最近更新 更多