WPF xamdatagrid высота + размер окна для содержимого
У меня есть окно с SizeToContent = "WidthAndHeight", местоположение запуска устанавливается вручную. Это окно содержит одну сетку из двух строк: первая с высотой "1*", а вторая с автоматической высотой. Первая строка содержит xamdatagrid (инфрагистика), а вторая содержит кнопки OkCancel.
после инициализации xamdatagrid окно вытянуто вертикально за видимую область.
Я не хочу привязывать максимальную высоту к некоторым вычислениям, основанным на системных параметрах и других константах.
код:
<Window x:Class="CopyRenameLineItems.CopyAndRename"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:igDP="http://infragistics.com/DataPresenter"
x:Name="CopyWindow" Title="Copy/Rename Line Item"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="500"
d:DataContext="{d:DesignInstance d:Type=copyRenameLineItems:CopyAndRenameViewModel}" SizeToContent="WidthAndHeight" >
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Assets.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid Margin="7" Name="MainGrid">
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<igDP:XamDataGrid Name="CopyRenameGrid" Margin="5" GroupByAreaLocation="None" DataSource="{Binding Rows,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
AutoFit="True" RecordContainerGenerationMode="PreLoad" >
<igDP:XamDataGrid.FieldSettings>
<igDP:FieldSettings
CellValuePresenterStyle="{StaticResource CellsBorder}"
AutoSizeOptions="All"
AllowEdit="True"
AllowRecordFiltering="True"
FilterLabelIconDropDownType ="MultiSelectExcelStyle"
CellClickAction="EnterEditModeIfAllowed"/>
</igDP:XamDataGrid.FieldSettings>
<igDP:XamDataGrid.FieldLayoutSettings>
<igDP:FieldLayoutSettings
AllowClipboardOperations="All"
AutoGenerateFields="False"
AutoFitMode="Never"
FilterRecordLocation="OnTop"
FilterUIType="LabelIcons" />
</igDP:XamDataGrid.FieldLayoutSettings>
<igDP:XamDataGrid.FieldLayouts>
<igDP:FieldLayout>
<igDP:FieldLayout.Fields>
<igDP:Field Name="Copy" >
<igDP:Field.Settings>
<igDP:FieldSettings Width="Auto" LabelPresenterStyle="{StaticResource CopyHeader}" />
</igDP:Field.Settings>
</igDP:Field>
<igDP:Field Name="Name" Label="Name"">
<igDP:Field.Settings>
<igDP:FieldSettings AllowEdit="False" Width="Auto" />
</igDP:Field.Settings>
</igDP:Field>
<igDP:Field Name="Description" Label="Description">
<igDP:Field.Settings>
<igDP:FieldSettings AllowEdit="False" Width="Auto"/>
</igDP:Field.Settings>
</igDP:Field>
<igDP:Field Name="NewName" Label="New name" Width="200">
</igDP:Field>
</igDP:FieldLayout.Fields>
</igDP:FieldLayout>
</igDP:XamDataGrid.FieldLayouts>
</igDP:XamDataGrid>
</Grid>
<Grid Grid.Row="1" Margin="0,7,0,0" VerticalAlignment="Bottom">
<Grid.ColumnDefinitions >
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid Grid.Column="0">
<Button Height="25" Width="45" HorizontalAlignment="Right" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
Content="OK" Command="{Binding CopyRenameWindowOkButtonClick}" CommandParameter="{Binding ElementName=CopyWindow}" Margin="0,0,15,0"/>
</Grid>
<Grid Grid.Column ="1">
<Button Height="25" Width="45" HorizontalAlignment="Right" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="Cancel" Command="{Binding CloseWindowCancelButtonClick}"
CommandParameter="{Binding ElementName=CopyWindow}"/>
</Grid>
</Grid>
</Grid>
</Window>
Спасибо,
Zehavit
2 ответа
Прежде всего, значение 1* ничего не значит с SizeToContent = "WidthAndHeight". Если вы измените "1*" на "Авто", у вас будет такое же поведение. Вы должны удалить SizeToContent = "WidthAndHeight" и сделать это:
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="3*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Grid>
your list ..
</Grid>
<Grid Grid.Row="1">
you buttons ..
</Grid>
</Grid>
Ваша первая строка (список) будет (3/(3+1))% от размера окна
Второй (1/(3+1))%.
Не использовать
SizeToContent="WidthAndHeight"
в одиночку, потому что это установит size
из Window
как его содержание. И ваш XamDataGrid
имеет много records
так Window
вырастет до очень большого размера. вместо этого просто удалите это свойство, то content
будет скорректирована в соответствии с Window
,
Или же
отдай свое Window
немного Height
сначала (как ни старайся binding
Height
вашей Window
в System.Windows.SystemParameters.PrimaryScreenHeight
) тогда вы можете использовать SizeToContent
а также Window
не будет расти бесконечно. Также Grid
высота строки не имеет значения, потому что вы не дали никаких фиксированных Height
любому control
или же Grid
,
Это решает проблему.