首页 > 解决方案 > 如何在 C# WPF 中获取菜单栏、水平行按钮和数据网格

问题描述

我很沮丧。来自 C++/MFC/Win API,我可以简单地捕获 WM_SIZE/OnSize() 处理程序,如何在 WPF 中进行这项工作。我想要一个水平菜单栏、一排按钮,然后是一个数据网格。我究竟做错了什么?

<DockPanel HorizontalAlignment="Stretch">
        <Menu DockPanel.Dock="Top" Background="Black" Foreground="White" HorizontalContentAlignment="Stretch">
            <MenuItem Header="_Data" Background="Black" Foreground="White">
                <MenuItem Header="_Exit"  Background="Black" Foreground="White"  Click="App_Exit_Click"/>
            </MenuItem>
            <MenuItem Header="_Client" Background="Black" Foreground="White">
                <MenuItem Header="_New"  Background="Black" Foreground="White"  Click="New_Client_Click"/>
            </MenuItem>
        </Menu>
    <StackPanel Orientation="Vertical" VerticalAlignment="Stretch">
        <StackPanel HorizontalAlignment="Stretch" Height="Auto" VerticalAlignment="Top" Orientation="Horizontal">
            <Button x:Name="NewClient" Width="80" Height="80" Content="New" Foreground="White"  Click="New_Client_Click" HorizontalAlignment="Left" HorizontalContentAlignment="Center">
                <Button.Background>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FF141420" Offset="0"/>
                        <GradientStop Color="#FF203060" Offset="1"/>
                    </LinearGradientBrush>
                </Button.Background>

            </Button>
            <Button x:Name="Sync" Width="80" Height="80" Content="Sync" Foreground="White"  Click="New_Client_Click" HorizontalAlignment="Left" HorizontalContentAlignment="Center">
                <Button.Background>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FF141420" Offset="0"/>
                        <GradientStop Color="#FF203060" Offset="1"/>
                    </LinearGradientBrush>
                </Button.Background>

            </Button>
        </StackPanel>
        <DataGrid VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="414"/>
    </StackPanel>


</DockPanel>

标签: c#wpfwindows

解决方案


DataGrid有一个固定的Height,所以它不能占用你窗口的剩余空间。此外,周围环境StackPanel将以正无穷大来测量其子级,这会使它们的大小调整为适合其内容的最小尺寸,这与您想要的相反。

您只需将按钮栏停靠在顶部即可。最后一个元素,即DataGrid,将默认填充 a 中的剩余空间DockPanel。我已经删除了下面代码中默认设置的冗余属性。

<DockPanel>
   <Menu DockPanel.Dock="Top" Background="Black" Foreground="White">
      <MenuItem Header="_Data" Background="Black" Foreground="White">
         <MenuItem Header="_Exit" Background="Black" Foreground="White" Click="App_Exit_Click"/>
      </MenuItem>
      <MenuItem Header="_Client" Background="Black" Foreground="White">
         <MenuItem Header="_New" Background="Black" Foreground="White" Click="New_Client_Click"/>
      </MenuItem>
   </Menu>
   <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
      <Button x:Name="NewClient" Width="80" Height="80" Content="New" Foreground="White" Click="New_Client_Click">
         <Button.Background>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
               <GradientStop Color="#FF141420" Offset="0"/>
               <GradientStop Color="#FF203060" Offset="1"/>
            </LinearGradientBrush>
         </Button.Background>
      </Button>
      <Button x:Name="Sync" Width="80" Height="80" Content="Sync" Foreground="White" Click="New_Client_Click">
         <Button.Background>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
               <GradientStop Color="#FF141420" Offset="0"/>
               <GradientStop Color="#FF203060" Offset="1"/>
            </LinearGradientBrush>
         </Button.Background>
      </Button>
   </StackPanel>
   <DataGrid/>
</DockPanel>

推荐阅读