0

这是关于 WPF 控件定位的奇怪行为。我有一个下面的控件,并且在设计时对齐得很好。但是运行时在按钮的角落给出了未对齐的位置

<Window x:Class="StackOverflow.LookAndWork"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Tables" Height="388" Width="314" ResizeMode="NoResize" >
    <Grid>
        <TextBox Margin="12,12,12,41"></TextBox>
        <Button Content="OK" Height="23" Margin="205,314,12,12" Name="button3" Width="75" IsCancel="True"  IsEnabled="False" />

    </Grid>
</Window>

设计时快照

设计时间

运行时快照

运行

假设如果我从窗口中删除了 ResizeMode="NoResize"。我可以在运行时看到正确的定位。ResizeMode="NoResize" 有什么问题?

任何帮助将不胜感激 !!!

4

4 回答 4

2

为了更好看,不要使用边距或大小。使用网格定义来拆分您的应用程序。

使用以下 xaml,您的应用程序将始终具有良好的外观:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="23" />
    </Grid.RowDefinitions>
    <TextBox />
    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="75" />
        </Grid.ColumnDefinitions>
        <Button Grid.Column="1" Content="OK" Name="button3" IsCancel="True"  IsEnabled="False" />
    </Grid>
</Grid>

宽度和高度可以在字典中定义。在这种情况下,在 RowDefinition 和 ColumnDefinition 属性中,使用 Auto 而不是值。

编辑: 使用字典

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Button}">
        <Setter Property="Width" Value="75"/>
        <Setter Property="Height" Value="23"/>
    </Style>
</ResourceDictionary>

然后

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary1.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBox />
    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <Button Grid.Column="1" Content="OK" Name="button3" IsCancel="True"  IsEnabled="False" />
    </Grid>
</Grid>
于 2013-03-13T11:01:47.457 回答
2

为什么不在控制级别添加边距,而不是在网格级别添加最小边距?

例子:

<Grid Margin="12,12,12,12">

这样,您将获得 12 像素的边距边框。在按钮上,不要做硬编码的左边距。相反,您可以使用HorizontalAlignment="Right"来完成这项工作。

附带说明一下,我不太喜欢在不指定 Grid.RowDefinitions、Grid.ColumnDefinitions、Grid.Row 和 Grid.Column 的情况下在网格中添加控件。它是 Grid 的强大工具。

于 2013-03-13T11:03:53.370 回答
1

我在 VisualStudio 2012 设计器中看不到同样的问题:http : //screencast.com/t/TGVgUyfR 设计时和运行时看起来都一样。所以在设计器的早期版本中应该有一个错误。不过,我建议您将按钮移动到单独的网格行或使用其他布局控件来组织您的视图。

于 2013-03-13T11:00:08.440 回答
1

为了扩展 Xaruth 的答案,我不会固定按钮行的高度,而是让它使用默认高度。宽度也是如此,我将定义按钮。

另请注意,我给按钮留有余量。不固定网格列/行大小的额外好处是,现在行高也考虑了边距:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <TextBox />
    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>

        <Button Grid.Column="1" Content="OK" Name="button3" IsCancel="True"  IsEnabled="False" Width="75" Margin="0,8,0,0" />
    </Grid>
</Grid>
于 2013-03-13T11:07:07.303 回答