- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个由 GridSplitter 分隔的 2 列的网格,使用以下 XAML 代码:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" MinWidth="20" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="*" MinWidth="100" />
</Grid.ColumnDefinitions>
<Rectangle Fill="Blue" />
<GridSplitter Grid.Column="1" Background="LightGray" HorizontalAlignment="Stretch" />
<Rectangle Fill="Yellow" Grid.Column="2" />
</Grid>
问题:右侧列的 MinWidth 被忽略
*我知道这个问题以前已经解决过,但它总是建议将列大小设置为 * 或在第一列上设置 maxWidth...我不希望这样。
<小时/>找到了一个解决方案,但是它很丑! :p,任何人都有更干净的方法来实现我想要的...无代码(如果可能)?
private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
var g = (Grid)sender;
Double maxW = e.NewSize.Width - g.ColumnDefinitions[2].MinWidth - g.ColumnDefinitions[1].ActualWidth;
g.ColumnDefinitions[0].MaxWidth = maxW;
}
最佳答案
基本问题是,网格分割器的工作原理是仅调整左列的宽度,并假设右列将星形大小来适应剩余空间。
这意味着您要解决的问题实际上是“如何限制左列的最大宽度,以便右列不会变得太小?”。这基本上就是您的代码示例正在做的事情。
如果您想要一个更可移植的解决方案,可以在 XAML 中实现,请创建一个 Silverlight behavior可以应用于网格(如下所示)。它将附加到父网格的 SizeChanged
事件,并且几乎完全执行您的代码片段的操作,但作为一种行为,您可以将它们拖放到 Blend 中或将它们附加到 XAML 中。
这是我为您整理的示例行为(基于您自己的代码):
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interactivity;
namespace GridSplitterMinWidth
{
public class MinWidthSplitterBehavior : Behavior<Grid>
{
public Grid ParentGrid { get; set; }
protected override void OnAttached()
{
base.OnAttached();
ParentGrid = this.AssociatedObject as Grid;
ParentGrid.SizeChanged += parent_SizeChanged;
}
void parent_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (ParentGrid.ColumnDefinitions.Count == 3)
{
Double maxW = e.NewSize.Width - ParentGrid.ColumnDefinitions[2].MinWidth -
ParentGrid.ColumnDefinitions[1].ActualWidth;
ParentGrid.ColumnDefinitions[0].MaxWidth = maxW;
}
}
protected override void OnDetaching()
{
base.OnDetaching();
if (ParentGrid != null)
{
ParentGrid.SizeChanged -= parent_SizeChanged;
}
}
}
}
<UserControl x:Class="GridSplitterMinWidthApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:GridSplitterMinWidth="clr-namespace:GridSplitterMinWidth"
xmlns:interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:Controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" MinWidth="20" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="*" MinWidth="100" />
</Grid.ColumnDefinitions>
<interactivity:Interaction.Behaviors>
<GridSplitterMinWidth:MinWidthSplitterBehavior/>
</interactivity:Interaction.Behaviors>
<Rectangle Fill="Blue" />
<Controls:GridSplitter Grid.Column="1" Background="LightGray" HorizontalAlignment="Stretch">
</Controls:GridSplitter>
<Rectangle Fill="Yellow" Grid.Column="2" />
</Grid>
</Grid>
</UserControl>
关于wpf - 固定大小的 GridSplitter MinWidth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11265698/
我希望 GridSplitter 使 TreeView 更大,以便更容易查看 TreeView 的内容。似乎找不到合适的地方放置分路器
我想要一个简单的 3 列网格,其中包含可调整大小的列和 80 的 MinWidth。 代码如下所示: 但它并没有以我想要和
我正在创建一个 3 列 UI,列之间有网格拆分器。我需要保存列的状态,这样如果用户关闭并重新打开应用程序,它看起来就像他们离开它一样。但我也试图让列按比例拆分——我的意思是,如果你拉伸(stretch
我想要一个带有两行和它们之间的分隔符的网格布局。行的最小高度应为 80 像素。 这段代码效果很好:
我有一个带有 3 列网格的应用程序。第一列和第二列之间的网格拆分器工作得很好。为了让分流器位于第二列和第三列之间,我为分流器创建了一个列。 (所以现在第三列实际上是第四列。) 当我调整其他列的大小时,
简单的 GridSplitter 在某种意义上表现得很奇怪,当我将它向左移动超出 MinWidth 时,另一列会无限扩展。我在这里缺少什么?
一旦使用 gridsplitter 调整网格大小,当其他行折叠时,该行 * 将不会回收空间。 我在主详细信息 View 中有以下三行网格。顶部有一个数据网格,中间有一个分割器,最后一行有一个内容控制
我有以下网格 我的GridSplitter位于第3行(第
我正在从 WinForms 迁移到 WPF,我需要自定义绘制一个 gridsplitter,如下所示。这是我的 WinForms 实现: 在 WinForms 中很容易实现。我继承自 Splitter
我刚开始尝试使用 gridsplitter 并偶然发现了一个非常奇怪的行为,我似乎无法修复它。显然其他人也有类似的问题(根据谷歌),但没有任何有用的评论。 我有一个包含 2 行的网格。启动时,底部的
我是 WPF 新手。我这样声明我的 Grid: 我基本上希望宽度为 5 的第
我是 WPF 的新手,遇到了一个小但令人沮丧的问题。 我有一个包含两行和两列的网格。第一行包含一个菜单栏,第二行包含左侧的一列(包含一个列表框)和右侧的一列(包含一个列表框)。 它还包含一个 Grid
我有这个: 我正在尝试保存和恢复拆分器位置。我正在使用 grid.C
使用下面的 XAML,当我将 GridSplitter 向左拖动时,它会将元素推出窗口。 如何将所有元素保留在窗口框架内?
我有以下 XAML:
我是 wpf 的初学者,今天我遇到一个奇怪的问题,如果我向网格列添加动画,gridsplitter 停止工作,下面是代码片段,这是一个毫无意义但很简单的测试代码,除了当鼠标进入右列,宽度从15扩大到1
我正在使用 GridSplitter在我的 WPF 应用程序中,并希望将其设置为代码中的特定初始位置。我被 GridSplitter 的行为困住了将特定值设置为 Height 时关联的属性 RowDe
我有一个由 GridSplitter 分隔的 2 列的网格,使用以下 XAML 代码: 问题:右侧列的 MinWid
我正在使用 Microsoft.Toolkit.Uwp.UI.Controls 中的 GridSplitter。在用户使用网格拆分器调整两列大小后,是否有办法重置调整大小并使网格的列宽恢复到调整大小之
我希望使用网格作为我的顶级布局。网格将有 1 列和 n 行。网格中的每一行还应包含一个 3 列 1 行的网格。第二列是 GridSplitter,我尝试使用 SharedSizeGroup,以便更改所
我是一名优秀的程序员,十分优秀!