У меня проблемы с размером моей программы WPF, чтобы она могла адаптироваться к разрешению экрана пользователя. У меня есть два снимка экрана ниже, один сделан в 1600 x 900
, а другой в 1920 x 1080
. Ни один из них не соответствует тому, как я хочу, чтобы мое приложение выглядело;
Как вы можете видеть на первом изображении, в более низком разрешении есть части пользовательского интерфейса, которые находятся за пределами экрана. Я мог бы использовать ScrollViewer
, но я бы предпочел, чтобы элементы фактически соответствовали экрану по вертикали, а затем использовали ScrollViewer
по горизонтали, если это необходимо.
На втором изображении, поскольку я пытался адаптировать программу так, чтобы она соответствовала более низкому разрешению, теперь есть огромное количество неиспользуемого пространства, которое я хотел бы, чтобы пользовательский интерфейс заполнил, а не оставил пустым. Я чувствую, что у меня есть общее представление о *
и auto
как о ширине, но мне кажется, что общий макет неверен. Вот снимок некоторого XAML для этих снимков экрана;
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto" MinWidth="180"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="250"/>
<ColumnDefinition Width="auto" MaxWidth="160"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Rectangle Fill="#FF5FCFBA" Stroke="Black" Grid.ColumnSpan="4" Grid.RowSpan="2"/>
<Label x:Name="jobTitleLabel" Content="Job" HorizontalAlignment="Left" Margin="26,10,0,5" VerticalAlignment="Center" FontSize="18" FontWeight="Bold" Grid.ColumnSpan="4"/>
<StackPanel Grid.Row="1" >
<Label Content="Reference:" FontSize="14" HorizontalAlignment="Right" Margin="0,0,0,1" VerticalAlignment="Center" />
<Label Content="Description:" FontSize="14" HorizontalAlignment="Right" Margin="0" VerticalAlignment="Center" />
<Label Content="Created:" FontSize="14" HorizontalAlignment="Right" Margin="0,5,0,0" Grid.Row="1" VerticalAlignment="Center" />
<Label Content="Deadline:" FontSize="14" HorizontalAlignment="Right" Grid.Row="2" VerticalAlignment="Center" Margin="-2,7,0,0" />
<Label Content="Start Date:" FontSize="14" HorizontalAlignment="Right" Grid.Row="2" VerticalAlignment="Center" Margin="-2,7,0,0" />
<Label Content="Employee Name:" FontSize="14" Grid.Row="3" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,4,0,0" />
<Label Content="Who's Job:" FontSize="14" Grid.Row="3" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,7,0,0" />
<Label Content="Priority:" FontSize="14" Grid.Row="3" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,7,0,0" />
</StackPanel>
<StackPanel Grid.Column="1" Grid.Row="1">
<TextBox x:Name="jobReferenceTextBox" Margin="5" FontSize="14" Grid.Column="1" VerticalAlignment="Center"/>
<TextBox x:Name="jobTitleTextBox" Margin="5" FontSize="14" Grid.Column="1" VerticalAlignment="Center" MaxWidth="291" MaxLength="30"/>
<wpftk:DateTimePicker x:Name="createdPicker" AutoCloseCalendar="True"
Margin="5,7,5,5" Format="Custom" FormatString="dd/MM/yyyy"
FontSize="14" TextAlignment="Left"
TimeFormat="LongDate" TimePickerAllowSpin="False"
TimePickerShowButtonSpinner="False"
TimePickerVisibility="Hidden" ShowButtonSpinner="False"
AllowTextInput="False"/>
<wpftk:DateTimePicker x:Name="deadlinePicker" AutoCloseCalendar="True" Margin="5,8,5,5" Format="Custom" FormatString="dd/MM/yyyy" FontSize="14" TextAlignment="Left" TimeFormat="LongDate" TimePickerShowButtonSpinner="False" TimePickerAllowSpin="False" TimePickerVisibility="Hidden" ShowButtonSpinner="False"/>
<wpftk:DateTimePicker x:Name="startDatePicker" AutoCloseCalendar="True" Margin="5,8,5,5" Format="Custom" FormatString="dd/MM/yyyy" FontSize="14" TextAlignment="Left" TimeFormat="LongDate" TimePickerShowButtonSpinner="False" TimePickerAllowSpin="False" TimePickerVisibility="Hidden" ShowButtonSpinner="False"/>
<TextBox x:Name="nameTextBox" Margin="5,6,5,5" FontSize="14" Grid.Column="1" Grid.Row="3" VerticalAlignment="Center" />
<ComboBox x:Name="itNameComboBox" Margin="5,7,5,5" FontSize="14" SelectedValuePath="Tag">
<ComboBoxItem Content="Unallocated" Tag="Unallocated"/>
<ComboBoxItem Content="Adam" Tag="AdamD"/>
<ComboBoxItem Content="Chris" Tag="Chris"/>
<ComboBoxItem Content="Dan" Tag="DanD"/>
<ComboBoxItem Content="Emily" Tag="EmilyC"/>
<ComboBoxItem Content="Kit" Tag="KitL"/>
<ComboBoxItem Content="Matt" Tag="Matt"/>
</ComboBox>
<ComboBox x:Name="priorityComboBox" Margin="5,7,5,5" FontSize="14" SelectedValuePath="Tag">
<ComboBoxItem Content="High" Tag="High"/>
<ComboBoxItem Content="Medium" Tag="Medium" />
<ComboBoxItem Content="Low" Tag="Low" />
</ComboBox>
</StackPanel>
<StackPanel Grid.Column="3" Grid.Row="1">
<ComboBox x:Name="jobPresetComboBox" IsEnabled="False" IsEditable="True" IsReadOnly="True" Text="Choose Predefined Job" Margin="5" FontSize="14" Grid.Column="1" Grid.Row="4" SelectionChanged="JobPresetComboBoxSelectionChanged" />
<Button x:Name="addJobButton" Content="Add a New Job" Margin="5" Click="AddJob" FontSize="14" Grid.Column="1" Grid.Row="4" />
<Button x:Name="updateButton" Content="Update Job Details" Margin="5" FontSize="14" Grid.Column="1" Grid.Row="4" Click="UpdateJob"/>
<Button x:Name="markAsCompletedButton" Content="Mark as Completed" Margin="5" FontSize="14" Click="MarkAsCompleted"/>
<Button x:Name="deleteButton" Content="Delete Job" Margin="5" FontSize="14" Click="DeleteJobPermanently"/>
<Button x:Name="excelButton" Content="Export to Excel" Margin="5" FontSize="14" Click="ExportToExcel"/>
<Button x:Name="restoreButton" Content="Restore Selected Job" Margin="5" FontSize="14" Visibility="Collapsed" Click="RestoreJob"/>
<Button x:Name="addToHistoryButton" Content="Add to History" Margin="5" FontSize="14" Visibility="Collapsed" Click="AddJobToHistory"/>
<Button x:Name="cancelButton" Content="Cancel Job Add" Margin="5" FontSize="14" Visibility="Collapsed" Click="CancelJobAdd"/>
</StackPanel>
<StackPanel Grid.Column="2" Grid.Row="1">
<TextBox x:Name="notesTextBox" ScrollViewer.VerticalScrollBarVisibility="Visible" Margin="5" FontSize="14" VerticalAlignment="Center" TextWrapping="Wrap" AcceptsReturn="True" MinHeight="260" MaxHeight="260" MaxWidth="400" MinWidth="400"/>
</StackPanel>
<Grid x:Name="bnumGrid" Grid.Column="4" Grid.Row="1" Margin="8,0,10,0" MinWidth="250">
<DataGrid x:Name="bnumDataGrid" ItemsSource="{Binding CurrentBnumsCollectionView}" MaxHeight="270"
CanUserAddRows="False" AutoGenerateColumns="False" SelectionChanged="BnumDataGridSelectionChanged"
IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Job ID" Width="0.75*" Binding="{Binding JobID}"/>
<DataGridTextColumn Header="Job Description" Width="3*" Binding="{Binding JobDescription}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
<StackPanel x:Name="searchGrid" Grid.Row="1" Grid.Column="5">
<Label Content="Search (ID)" HorizontalAlignment="Left" Margin="5,5,0,5" VerticalAlignment="Center" FontSize="20" FontWeight="Bold"/>
<TextBox x:Name="searchBox" TextWrapping="Wrap" Margin="20,5" FontSize="14" VerticalAlignment="Center" TextChanged="CallSearchBoxFilter"/>
<Label Content="Press Esc to clear filter" Margin="5,10,5,5" FontSize="14"/>
</StackPanel>
</Grid>
Понятно, что туда включено много не относящегося к делу кода, но я не хотел пропустить что-то, что, по моему мнению, не имеет никакого эффекта. Общий макет представляет собой NavigationFrame
, расположенный внутри Page
, который находится внутри Window
, чтобы я мог перемещаться по страницам в моей программе.
На этой конкретной странице есть Grid
с двумя строками, одна из которых содержит DataGrid, а другая содержит элементы на изображениях выше. Я не уверен, является ли родительский элемент Grid
причиной проблем, но решил сначала опубликовать это на случай, если возникнут какие-либо «очевидные» проблемы с моим макетом.
Viewbox
заключается в том, что он масштабирует всю страницу, поэтому ваши текстовые поля становятся больше/меньше. - person ChrisF   schedule 19.01.2016ViewBox
? просто интересно, прежде чем я начну тестировать с ним - person CBreeze   schedule 19.01.2016WrapPanel
, но каждый из них имеет значение для вашего дизайна. - person ChrisF   schedule 19.01.2016Page
определил ширину или высоту. Или дажеNavigationFrame
. Лично я используюContentControl
, а затем определяюTemplates
для каждой страницы. - person XAMlMAX   schedule 21.01.2016Labels
совпадало сTextBoxes
:( - person CBreeze   schedule 21.01.2016Labels
, я бы использовалTextBlock
. Из того, что я вижу в вашемxaml
, кажется, что вы используете для них не тот контейнер. Вы должны использоватьGrid
, чтобы содержимое помещалось в сетку. Контейнеры, которые вы используете, не подходят для того, чего вы хотите достичь. Как сказал Мухаммад Башир, вам нужно заменить этиStackPanel
наGrid
, которые будут охватывать все стороны, придавая вам тот вид, который вы хотите. - person XAMlMAX   schedule 25.01.2016Row
изGrid
, а не одинStackPanel
занималColumn
изGrid
, как я сделал здесь? - person CBreeze   schedule 25.01.2016StackPanel
, который будет складывать элементы, я бы использовал тамGrid
, который будет распределять предметы для вас. Поэтому, когда вы используетеStackPanel
, вы можете заменить его наColumn
вместоGrid
. Если это имеет смысл. Я приведу примерxaml
, чтобы вы могли лучше понять это. - person XAMlMAX   schedule 25.01.2016Grid
будет отделятьTextBlocks
без использованияRows
? - person CBreeze   schedule 25.01.2016xaml
. - person XAMlMAX   schedule 25.01.2016TextBlock
имели фиксированную высоту и ширину, чтобы они не увеличивались, когда пользователь вводит в них! - person CBreeze   schedule 25.01.2016TextBox
:-), если это так, вам нужно установитьRowSpan
на максимальное количество строк в сетке, а затем установить видимость ScrollViewer, чтобы он был видимым, аTextWrap
наWrapWithOverflow
. Если мой ответ помог принять или проголосовать, приятно быть оцененным. - person XAMlMAX   schedule 25.01.2016UIElements
работают вWPF
, чтобы заставить экран работать так, как вы хотите. Один вопрос, что ты имеешь в виду под тем, что экран выглядит странно? - person XAMlMAX   schedule 25.01.2016