Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “WPF窗口调整大小”;吃;控制宽度_C#_Wpf_Xaml - Fatal编程技术网

C# “WPF窗口调整大小”;吃;控制宽度

C# “WPF窗口调整大小”;吃;控制宽度,c#,wpf,xaml,C#,Wpf,Xaml,我有一个问题,我挣扎了一天。我试图将一些控件集中到网格布局中。我有两列,我想要一半的控件居中于第一列,另一半居中于第二列 当窗口调整大小时,其中一些的边缘被“吃掉”,我无法确定问题所在 有人能发现这个问题吗 <Grid Margin="0,2,0,-2"> <Grid.RowDefinitions> <RowDefinition Height="*"/> </Grid.RowDefinitio

我有一个问题,我挣扎了一天。我试图将一些控件集中到网格布局中。我有两列,我想要一半的控件居中于第一列,另一半居中于第二列

当窗口调整大小时,其中一些的边缘被“吃掉”,我无法确定问题所在

有人能发现这个问题吗

  <Grid Margin="0,2,0,-2">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>


//....... 
 <ComboBox x:Name="optMenuLeft"  Margin="0,271,0,0" VerticalAlignment="Top" Height="26" HorizontalAlignment="Center" Width="170" Grid.RowSpan="2"  />
 <Label Content="Menu" Margin="141,271,390,0" VerticalAlignment="Top"  HorizontalContentAlignment="Right" HorizontalAlignment="Center" Width="69" Grid.RowSpan="2" />
 <ComboBox x:Name="optBedOccupancyLeft"  VerticalAlignment="Top" Height="26" Grid.RowSpan="2" HorizontalAlignment="Center" Width="170" Margin="0,240,0,0"/>
 <Label Content="Bed Occupancy" Margin="0,240,270,0" VerticalAlignment="Top" HorizontalContentAlignment="Right" Grid.RowSpan="2" HorizontalAlignment="Center" Width="94"/>
//.......
  <ComboBox Name="optMenuRight"  Margin="255,271,175,0" Grid.Column="1" VerticalAlignment="Top" Height="26" HorizontalAlignment="Center" Width="170"/>
  <Label Content="Menu" Margin="176,271,353,0" Grid.Column="1" VerticalAlignment="Top"  HorizontalContentAlignment="Right" HorizontalAlignment="Center" Width="71"/>
  <ComboBox Name="optBedOccupancyRight"  Margin="255,240,175,0" Grid.Column="1" VerticalAlignment="Top" Height="26" HorizontalAlignment="Center" Width="170" Grid.RowSpan="2"/>
  <Label Content="Bed Occupancy" Grid.Column="1" Margin="0,240,200,0" VerticalAlignment="Top" HorizontalContentAlignment="Right" Grid.RowSpan="2" HorizontalAlignment="Center" Width="94"/>
//.....

//....... 
//.......
//.....

最简单的方法是在网格中使用网格。外部网格将窗口拆分为两列。内部网格将柱拆分为四个单元(2x2)。只要将内部网格居中,它就会像一个符咒一样工作

<Grid x:Name="LayoutRoot">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Grid x:Name="LeftColumn" VerticalAlignment="Center" HorizontalAlignment="Center">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <Label Content="Bed Occupancy" />
        <ComboBox x:Name="optBedOccupancyLeft"  Grid.Column="1" />

        <Label Content="Menu" Grid.Row="1"/>
        <ComboBox  x:Name="optMenuLeft" Grid.Column="1" Grid.Row="1" />
    </Grid>

    <Grid x:Name="RightColumn" VerticalAlignment="Center" HorizontalAlignment="Center>
        <!-- the same as left column -->
    </Grid>

</Grid>


我还经常使用更高级的方法:

  • 使用UniformGrid定义列。xaml更小更干净
  • 使用HeaderedContentControl定义标签和输入
  • 使用网格的SharedSizeScope功能,使标签宽度相等:
  • 
    
    LabelCalueControlStyle可以利用共享列大小

    <Style x:Key="LabelValueContentControl" TargetType="HeaderedContentControl">
        <Setter Property="Padding" Value="5" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="HeaderedContentControl">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" SharedSizeGroup="LabelValueContentControl.Label" />
                            <ColumnDefinition Width="*"  />
                        </Grid.ColumnDefinitions>
    
                        <ContentPresenter ContentSource="Header" 
                                            Margin="{TemplateBinding Padding}" 
                                            HorizontalAlignment="Right" />
    
                        <ContentPresenter Grid.Column="1" Margin="{TemplateBinding Padding}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    
    
    
    是边距切断了标签和组合框。@想知道如何解决这个问题,但仍将控件保持在所需的位置吗?您可以使用列宽,并像这样设计窗口。例如,三列:宽度“自动”、宽度“*”和宽度“自动”,这将使第一列位于左侧,第三列位于右侧,第二列根据窗口大小填充中间。您是否尝试使用viewbox?感谢您提供的两个详细答案,我已开始实现此功能,几分钟后我将接受它作为答案
    <UniformGrid x:Name="LayoutRoot" Rows="1">
    
        <StackPanel x:Name="LeftColumn" Grid.IsSharedSizeScope="True"
                    HorizontalAlignment="Center" VerticalAlignment="Center">
    
            <HeaderedContentControl Header="Bed Occupancy" Style="{StaticResource LabelValueContentControl}">
                <ComboBox x:Name="optBedOccupancyLeft" />
            </HeaderedContentControl>
    
            <HeaderedContentControl Header="Menu" Style="{StaticResource LabelValueContentControl}" >
                <ComboBox x:Name="optMenuLeft" />
            </HeaderedContentControl>
        </StackPanel>
    
        <StackPanel x:Name="RightColumn"  Grid.IsSharedSizeScope="True">
            <!-- the same as left column -->
        </StackPanel>
    
    </UniformGrid>
    
    <Style x:Key="LabelValueContentControl" TargetType="HeaderedContentControl">
        <Setter Property="Padding" Value="5" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="HeaderedContentControl">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" SharedSizeGroup="LabelValueContentControl.Label" />
                            <ColumnDefinition Width="*"  />
                        </Grid.ColumnDefinitions>
    
                        <ContentPresenter ContentSource="Header" 
                                            Margin="{TemplateBinding Padding}" 
                                            HorizontalAlignment="Right" />
    
                        <ContentPresenter Grid.Column="1" Margin="{TemplateBinding Padding}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>