Wpf Qt程序员的xaml布局介绍

Wpf Qt程序员的xaml布局介绍,wpf,qt,xaml,layout,Wpf,Qt,Xaml,Layout,我已经习惯了Qt及其Qt设计器 XAML及其布局控件“grid”和“StackPanel”在某种程度上是相似的,但我仍然错过或没有找到Qt中设计的一些最常见属性。因为我对XAML完全陌生,所以我想知道答案或更多可用文档 例如,我想添加两个元素(比如按钮),水平或垂直,具有默认高度、最小高度和最小宽度。如果水平对齐,则应将其推至左侧,右侧的剩余侧应自由。这意味着如果窗口大小增加,按钮的大小不会增加。在Qt中,这是通过网格与间隔物的组合来实现的(参见示例) 我的第一个XAML与我期望的相去甚远。Ro

我已经习惯了Qt及其Qt设计器

XAML及其布局控件“grid”和“StackPanel”在某种程度上是相似的,但我仍然错过或没有找到Qt中设计的一些最常见属性。因为我对XAML完全陌生,所以我想知道答案或更多可用文档

例如,我想添加两个元素(比如按钮),水平或垂直,具有默认高度、最小高度和最小宽度。如果水平对齐,则应将其推至左侧,右侧的剩余侧应自由。这意味着如果窗口大小增加,按钮的大小不会增加。在Qt中,这是通过网格与间隔物的组合来实现的(参见示例)

我的第一个XAML与我期望的相去甚远。
RowDefinition
的定义是从教程中复制的。但是我不明白它的意思

<Window x:Class="SpectrumViewer.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Spectrum Viewer" Height="350" Width="525">
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="*" />
      <RowDefinition Height="Auto" />      
    </Grid.RowDefinitions>
    <StackPanel Orientation="Horizontal" Margin="8" VerticalAlignment="Top">
      <Button MinWidth="75" MaxHeight="23" Margin="10" HorizontalAlignment="Left" Width="100" Name="buttonTest">test</Button>
      <TextBox MinWidth="75" MaxHeight="23" Margin="10" HorizontalAlignment="Left" Width="150" Name="textBoxValue"/>
    </StackPanel>
    <StackPanel Orientation="Horizontal" Margin="8" >
      <Button MinWidth="75" MaxHeight="23" Margin="10" HorizontalAlignment="Left" Width="100" Name="button1">button 1</Button>
      <Button MinWidth="75" MaxHeight="23" Margin="10" HorizontalAlignment="Left" Width="100" Name="button2">button 2</Button>
    </StackPanel>
  </Grid>
</Window>

测试
按钮1
按钮2
下一个图像显示图元被推到左侧,但彼此上方的两个堆叠面板不会推到顶部。如果我用
VerticalAlignment=“Top”
将它们都设置为重叠,这也是错误的。

如果我调整窗口的大小,可以看到元素没有调整大小,第二个
StackPanel
与第一个重叠:


相反,应将元素的大小调整为最小宽度,并且应禁止进一步调整窗口的大小。

当您将两个
垂直对齐设置为
Top
时,两个堆栈面板重叠的第一个问题是,因为您没有指定它们应该位于哪个
网格.Row
中,默认值为
Grid.Row=0
。指定行索引,它们不会重叠:

<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="8" VerticalAlignment="Top">
  ....
</StackPanel>
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="8" VerticalAlignment="Top">
  ....
</StackPanel>

或者设置
窗口的
MinWidth
本身:)

当您将两个
垂直对齐设置为
Top
时,两个堆栈面板重叠的第一个问题是,因为您没有指定它们应该位于哪个
网格。行
中,默认值将同时位于
Grid.Row=0
中。指定行索引,它们不会重叠:

<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="8" VerticalAlignment="Top">
  ....
</StackPanel>
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="8" VerticalAlignment="Top">
  ....
</StackPanel>

或者设置
窗口的
MinWidth
本身:)

自从一个世纪以来,Qt就有了这样的功能(自动最小宽度),MS发明了一个新的设计器(mfc方式是desaster),但在这样简单的任务中失败了,这是一个小问题。不管怎样,行号解决了大多数问题。它现在可以与
@MatthiasPospiech一起使用。您还可以尝试窗口的SizeToContent和ResizeMode。SizeToContent会告诉窗口大小要精确到其内部控件的高度和宽度。您有这些方法的代码示例吗。我不知道如何应用它们?如果可以的话,可以找一本亚当·内森的书《WPF释放》;它会比你在网上闲逛更快地回答这些问题和许多其他问题。令人遗憾的是,自从一个世纪以来,Qt就有了这样的功能(自动最小宽度),MS发明了一种新的设计器(mfc方式是desaster),但在这么简单的任务上失败了。不管怎样,行号解决了大多数问题。它现在可以与
@MatthiasPospiech一起使用。您还可以尝试窗口的SizeToContent和ResizeMode。SizeToContent会告诉窗口大小要精确到其内部控件的高度和宽度。您有这些方法的代码示例吗。我不知道如何应用它们?如果可以的话,可以找一本亚当·内森的书《WPF释放》;它会比你在网上闲逛更快地回答这些问题和许多其他问题。