是否有可能增加用户可以抓住它的网格分割器的距离?
我的分割器宽度只有1像素.我希望能够从更远的距离抓住分路器.
就像现在一样,我必须将鼠标指向精确的1px线才能抓住它.
并且分离器的宽度仍必须是1px
使用gridsplitter调整网格大小后,行*将在其他行折叠时不回收空间.
我在主要详细视图中有三行的以下网格.中间的分割器顶部的数据网格和最后一行的contentcontrol视图.分离器上有一个关闭按钮,可以折叠细节.这一切都有效,但一旦用户使用gridsplitter调整大小.
<Grid Margin="3,0">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Style="{StaticResource CollapsableRow}"/><!-- Splitter Here -->
<RowDefinition Style="{StaticResource CollapsableRow}"/>
</Grid.RowDefinitions>
Run Code Online (Sandbox Code Playgroud)
GridSplitter风格:
<Style x:Key="gridSplitterStyle" TargetType="{x:Type GridSplitter}">
<Setter Property="Visibility" Value="{Binding IsItemSelected, Converter={StaticResource BoolToShow},ConverterParameter='Visible|Collapsed'}" />
<Setter Property="Width" Value="Auto"/>
<Setter Property="Height" Value="14"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="Border.BorderBrush" Value="#FF6593CF" />
<Setter Property="Border.BorderThickness" Value="0,1,0,0" />
<Setter Property="UIElement.SnapsToDevicePixels" Value="True" />
<Setter Property="UIElement.Focusable" Value="False" />
<Setter Property="Control.Padding" Value="7,7,7,7" />
<Setter Property="Cursor" Value="SizeNS" /></Style>
Run Code Online (Sandbox Code Playgroud)
就像我说的那样崩溃正常工作,除非使用网格探测器来调整大小.之后,空白停留.
编辑:HB和codenaked有简单而一致的建议,所以我试图在数据触发器中成功实现它们:
<Style x:Key="CollapsableRow" TargetType="{x:Type RowDefinition}">
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedItem, Converter={StaticResource IsNullConverter}}" Value="True">
<Setter Property="RowDefinition.Height" Value="0"/>
</DataTrigger>
<DataTrigger …Run Code Online (Sandbox Code Playgroud) 我有一个问题,gridsplitter将我的listview推出这个组合中的视图.重现步骤:
对我来说,这会慢慢推动WindowView外的ListView.请注意,ScrollViewer实际上随着窗口的大小减小,但速度不同且慢慢消失.一旦滚动查看器开始滑出视图,分割器就不能再使用了!
奇怪的是,如果我不首先最小化左侧面板,我不会得到这种行为!
对此有什么解决方法?
<Window x:Class="LayoutTest3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="600" Width="800" MinHeight="600" MinWidth="800" >
<Window.Resources>
<XmlDataProvider XPath="/Celebrities/Celebrity" x:Key="celebs">
<x:XData>
<Celebrities xmlns="">
<Celebrity Name="Jimmy">
<LastName>Page</LastName>
</Celebrity>
<Celebrity Name="Johnny">
<LastName>Depp</LastName>
</Celebrity>
<Celebrity Name="Britney">
<LastName>Spears</LastName>
</Celebrity>
</Celebrities>
</x:XData>
</XmlDataProvider>
<DataTemplate x:Key="NameTemplate">
<TextBlock Text="{Binding XPath=@Name}" />
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" MinWidth="100" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" MinWidth="400" />
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Background="Blue" />
<GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Center" ResizeBehavior="PreviousAndNext" VerticalAlignment="Stretch" Background="Red" />
<Border Grid.Column="2" Background="Green">
<ListView ItemsSource="{Binding Source={StaticResource …Run Code Online (Sandbox Code Playgroud) 我是WPF的新手.我宣布我Grid是这样的:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="5"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid Grid.Column="0">
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
</Grid>
Run Code Online (Sandbox Code Playgroud)
我基本上希望宽度为5的第3列GridSplitter成为左列和右列的可调整大小.所以我有分配器的代码:
<GridSplitter Grid.Column="1" Grid.RowSpan="3" ResizeDirection="Columns" Height="Auto"
VerticalAlignment="Stretch" HorizontalAlignment="Center"
Margin="0" Background="Black"/>
Run Code Online (Sandbox Code Playgroud)
我没有看到GridSplitter列中的内容.我把它设置得对吗?谢谢.
我在扩展器(存在于wpf窗口的右侧)之前有一个网格分割器,当我运行应用程序时,我需要使用网格分割器在扩展后查看扩展器中的更多数据,但问题是何时我是拖曳分割器我无论原始宽度如何都能看到我的扩展器的全部视图但是在点击扩展器折叠之后它将不会通过保持分割器拖动宽度而转到其原始位置.所以任何人都可以帮助我如何将膨胀机送回原来的位置.
谢谢,@ nagaraju.
我有一个WPF页面,上面有一个Grid.
有三排.第0行包含GridView Height="*".第1行包含GridSplitter Height="auto".第2行包含详细信息表单Height="2*".
这是事情 - 我有一个按钮,应该切换详细信息表单的可见性.这很好用.除了它只隐藏第2行中的表单,它不会扩展第0行中的网格以填充空格.我想要的是按钮在第0行中切换GridView以占用所有空间,然后切换回原来的位置.
显然,使用行内表单的可见性无法完成我想要的任务.
但是我需要玩什么呢?
我刚刚开始尝试使用网格分裂器并且偶然发现了一个非常奇怪的行为,我似乎无法修复它.显然其他人有类似的问题(根据谷歌),但没有有用的评论.
我有一个2行的网格.在启动时,底部的一个有Hight250个.顶行用剩下的*.当我使用拆分器调整行的大小时,行为与顶行的预期一致.但是当我向上拖动分割器并经过程序窗口时,底行的内容将从窗口中掉出(=向下移动直到它消失).我希望我不能使每一行都大于父容器.
<Grid x:Name="grid_main" ScrollViewer.VerticalScrollBarVisibility="Disabled" >
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition MinHeight="250" Height="250"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<GridSplitter x:Name="splitter"
ResizeDirection="Rows" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Width="Auto"
Height="5" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="0" ResizeBehavior="BasedOnAlignment" />
<Grid Grid.Column="0" Grid.Row="0">
</Grid>
<Grid Grid.Column="0" Grid.Row="1">
</Grid>
</Grid>
Run Code Online (Sandbox Code Playgroud)
这是我的代码.两行的内容再次托管在网格中,并且为了简单起见已被删除.再次:调整顶行的大小可以正常工作.但是底行可以调整为无穷大.如果我硬编码,它会按预期工作MaxHeight.但这取决于窗口大小.
我有非常简单的布局,看起来:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" MinWidth="200"></ColumnDefinition>
<ColumnDefinition Width="5"></ColumnDefinition>
<ColumnDefinition Width="Auto" MinWidth="50"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Border Grid.Column="0"
BorderBrush="Red"
BorderThickness="2">
<!-- Any picture-->
<Image Source="/Resources/PreviewTest.png"></Image>
</Border>
<GridSplitter Grid.Column="1"
Width="5"
HorizontalAlignment="Center"
VerticalAlignment="Stretch"
ResizeBehavior="PreviousAndNext"></GridSplitter>
<Expander Grid.Column="2"
ExpandDirection="Left"
BorderBrush="RoyalBlue"
BorderThickness="2">
<!-- Any picture-->
<Image Source="/Resources/PreviewTest.png"></Image>
</Expander>
</Grid>
Run Code Online (Sandbox Code Playgroud)
问题是:当我GridSplitter向左拖动时,右栏从窗口边框出来,如动画所示.我发现当第三列的宽度设置为"Auto"(Width="Auto")时会发生这种情况.如果我设置Width="*" GridSplitter工作正常,第三个Column不从窗口边框出去.那么为什么Width="Auto"会发生呢?

以下代码有两个问题。
问题1)在函数中,MaximizePreview()我想存储左列的旧宽度(lastListViewWidth = widthListView),并且在调用时MaximizeListView(),我想恢复左列(和右列)的先前宽度。因此,我写回存储的宽度lastListViewWidth。问题是,恢复宽度后,分离器无法准确地移动到旧位置。多次调用这两个函数,在GridSplitter每个调用周期中,向左移动的次数越来越多,ListViewWith变小。我该怎么做才能准确地存储和恢复GridSplitter的位置以及列的左右宽度?
问题2)您可以看到我添加的MinWidht="0.1",而不是MinWidth="0"。这样做的原因是,如果将拆分器绝对向右移动,而不是以编程方式将拆分器向左移动,则右列将保持折叠状态。如果通过拖动将分隔器向左移动,则当我向左移动分隔器时,右列会再次增大。当将MinWidth设置为0.1时,以编程方式将拆分器从最右边的位置向左移动会很好,并且右列会像手动移动拆分器时一样增长。这是怎么回事
我定义Grid如下:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" Name="columnListView" />
<ColumnDefinition Width="38" Name="columnSplitter"/>
<ColumnDefinition Width="*" Name="columnPreView" MinWidth="0.1" />
</Grid.ColumnDefinitions>
Run Code Online (Sandbox Code Playgroud)
我必须以GridSplitter编程方式移动按钮/功能:
此功能最小化左列。
private void MaximizePreview() {
double widthPreview = columnPreView.ActualWidth;
double widthSplitter = columnSplitter.ActualWidth;
double widthListView = columnListView.ActualWidth;
if(widthListView > 0) {
lastListViewWidth = widthListView;
columnListView.Width = new GridLength(0, GridUnitType.Star);
columnPreView.Width = new GridLength(ActualWidth - widthSplitter, GridUnitType.Star);
};
}
Run Code Online (Sandbox Code Playgroud)
并希望通过此功能恢复先前的位置。
private void …Run Code Online (Sandbox Code Playgroud) 在WPF中,我有一个布尔到长度转换器,我已经绑定到列和行定义.
此转换器用于读取绑定的布尔值,以确定是应隐藏还是显示行/列.
这样做是为了让我可以"最大化"网格的给定部分或将其恢复到原始大小.只要我不使用gridsplitter来调整大小,这就可以工作.一旦发生这种情况,它就不再设置所需的长度.我有一种感觉,一旦使用了gridsplitter,它就会删除对列定义的绑定.有没有解决这个问题?
变流器
[ValueConversion(typeof(bool), typeof(GridLength))]
public class BoolToGridLengthConverter : IValueConverter
{
public int Length { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value == true) ? new GridLength(Length == 0 ? 1 : Length, GridUnitType.Star) : new GridLength(0);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{ // Don't need any convert back
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
XAML
<Grid>
<Grid.Resources>
<helpers:BoolToGridLengthConverter x:Key="BoolToGridLengthConverter1" Length="1" />
<helpers:BoolToGridLengthConverter x:Key="BoolToGridLengthConverter2" Length="2" /> …Run Code Online (Sandbox Code Playgroud) gridsplitter ×10
wpf ×10
c# ×4
xaml ×3
column-width ×1
expander ×1
grid ×1
resize ×1
wpfdatagrid ×1