【问题标题】:WPF, width of control change with window width changeWPF,控件宽度随窗口宽度变化而变化
【发布时间】:2015-04-14 10:55:25
【问题描述】:

在 WPF 应用程序中,具有 3 列的网格面板定义如下

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

第二列有一个滑块,当窗口宽度减小时滑块的宽度需要减小,并且在某些时候滑块需要消失(一种响应式设计)。 我尝试将第二列和滑块的绑定宽度命名为该列的“ActualWidth”属性,但没有帮助。 还有另一种方法可以处理窗口的大小更改事件并进行一些调整。还有其他简单的方法吗?


更新 1: 添加更多我的代码

 <Grid VerticalAlignment="Top" HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="250"/>
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="250"/>
</Grid.ColumnDefinitions>
<!-- some other elements in cell 0-->
<StackPanel Grid.Column="1"  Orientation="Horizontal" HorizontalAlignment="Center">
            <Button Width="22" Height="22">
                <Image Source="a.png"/>
            </Button>
            <Slider MinWidth="100" MaxWidth="320" Width="320"/>
            <Button Width="22" Height="22" >
                <Image Source="b.png"/>
            </Button>
  <!-- some other elements in cell 2-->
 </StackPanel>
 </Grid>

【问题讨论】:

  • 请分享更多代码!

标签: wpf xaml binding wpf-controls


【解决方案1】:

假设滑块是一个通用的 WPF 滑块控件,那么只需将滑块放在第二列内即可,因为默认情况下该控件应填充所有可用的列空间。也许您应用于滑块的样式正在影响此功能?如果您使用此代码,滑块应该填满列,并随着窗口/列的大小调整而缩小到虚无

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="250"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="250"/>
    </Grid.ColumnDefinitions>
    <Slider Grid.Column='1'></Slider>
</Grid>

编辑:

根据您的新代码,也许这可能是您所追求的更多?

<DockPanel VerticalAlignment="Top">
    <!-- Elements in cell 0-->
    <Grid Width="250" DockPanel.Dock="Left"/>

    <!-- Elements in cell 2-->
    <Grid Width="250" DockPanel.Dock="Right"/>

    <!-- Cell 1-->
    <DockPanel>
        <Button DockPanel.Dock="Left" Width="22" Height="22">
            <Rectangle Fill="Blue"/>
        </Button>
        <Button DockPanel.Dock="Right" Width="22" Height="22" >
            <Rectangle Fill="Blue"/>
        </Button>
        <Slider/>
    </DockPanel>
</DockPanel>

滑块会相应调整大小并消失,在窗口大小调整过程中滑块位置会保持一致

【讨论】:

  • 这个案子最后也被砍掉了。放大并观察滑块的右端,它的打开
【解决方案2】:

这是因为ColumnDefinitionActualWidth 不是DependencyProperty 并且ColumnDefinition 在此属性发生更改时不会通知。

请尝试将第 2 列中的所有控件分组到 Grid 内并绑定到网格的 ActualWidth

【讨论】:

  • 添加了更多我的代码。我试图绑定到我拥有的堆栈面板的实际宽度,但没有工作
  • 那是因为 StackPanel 的宽度是由它的内容决定的。将您的 StackPanel 放入 Grid 并绑定到 Grid 的 ActualWidth。应该工作......
  • 这没有帮助。滑块在所有窗口大小下都显示相同的固定大小,并且在窗口大小非常小时时隐藏