Проблемы с изменением размера UserControl потомков или, возможно, лучший метод, чем использование UserControl?

c# wpf xaml user-controls

161 просмотра

1 ответ

В настоящее время я занимаюсь разработкой небольшой программы WPF, которая выступает в качестве шаблона и рекордера офлайн-билетов.

Дизайн моей программы в настоящее время основан на создании пользовательского элемента управления в качестве заявки. Этот тикет (UserControl) представляет собой группу текстовых полей. Вот скриншот моего usercontrol.

Билет (UserControl)

Моя программа затем читает каждое поле в заявке и сохраняет его в текстовом файле.

Это все работы ожидают изменения размера. WPF - это боль в изменении размера (по моему мнению). У меня нет большого опыта работы с WPF, но я не могу заставить UserControl изменять размеры сетки, которую я использую в своем главном окне. Размер элемента управления изменяется, но ни один из дочерних элементов моего пользовательского элемента управления не изменяет размер.

Вот как выглядит мое главное окно

Главное окно

Билет добавляется в таблицу под вкладкой «Билет». Все изменяемые размеры ожидают дочерние элементы UserControl (текстовые поля, кнопки и т. Д.).

Вопрос: Есть ли лучший способ сделать что-то вроде этого (IE не использует пользовательский элемент управления) или мне просто нужно использовать грязную сетку и кучу растяжимых и автоматических свойств в моем UserControl и ее Children, чтобы заставить это работать ?

Возможно, я просто использую UserControls совершенно неправильно в этом контексте.

Автор: Ben Источник Размещён: 08.11.2019 10:59

Ответы (1)


0 плюса

Решение

Поведение по умолчанию большинства элементов управления WPF (и, следовательно, пользовательских элементов управления) заключается в расширении и занимают столько места, сколько доступно

например (пространства имен xml для ясности)

<Window>
  <Button Content="Hello" />
</Window>

создаст одну большую кнопку, если вы развернули окно

В вашем случае я предполагаю, что вы используете дизайнер Visual Studio для выравнивания и размера отдельных элементов управления. Одно из действий сгенерированного дизайнером кода - установить Marginсвойство, если вы перемещаете элементы управления, чтобы расположить их, Widthи Heightесли вы настраиваете размер. Это заставляет их перестать расширяться или растягиваться.

Как правило, я избегаю использования визуального дизайнера, но напрямую использую редактор XAML для разработки макета и проверки того, что он выглядит так, как задумано в визуальном конструкторе.

Хотя элементы управления расширяются и сжимаются в зависимости от доступности экрана, иногда это может привести к плохим или странным размерам и размерам. Обычно , когда я использую в Gridкачестве макета, я поставил отдельные детские MinWidth, MinHeight, MaxWidthи MaxHeightдля управления , которые не выглядят хорошо , когда растягиваются или сжимаются слишком много (радиокнопки, CheckBox). Для некоторых элементов управления желательно растягиваться только по горизонтали (однострочный ввод текста, например, для поля определения проблемы в вашем случае), где было бы целесообразно установить Gridвысоту строки, чтобы autoэлемент управления получал достаточную высоту, необходимую для этого.

Также может быть хорошо использовать a GridSplitterс разумными ограничениями минимальной / максимальной ширины, чтобы позволить пользователю изменять размер столбца LHS, если его размер окна слишком мал

Как то так (не проверено, хотя)

<Window>
  <Window.Resources>
    <Style TargetType="TextBox">
      <Setter Property="Margin" Value="5" />
    </Style>
    <Style TargetType="Button">
      <Setter Property="Margin" Value="5" />
    </Style>
    <Style TargetType="TextBlock">
      <Setter Property="Margin" Value="5" />
      <Setter Property="FontWeight" Value="Bold"/>              
    </Style>
  </Window.Resources>

  <Grid>  
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="0.3*" MinWidth="200" MaxWidth="350" />
      <ColumnDefinition Width="0.7*" />
    </Grid.ColumnDefinitions>    

    <Grid.RowDefinitions>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>

      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>

      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>

      <RowDefinition Height="*"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>

    </Grid.RowDefinitions>

    <!-- first column -->

    <TextBlock Grid.Column="0"
               Grid.Row="0"
               Text="Employee ID" />

    <TextBox Grid.Column="0"
             Grid.Row="1"
             Text="{Binding EmployeeID}" />

    <TextBlock Grid.Column="0"
               Grid.Row="2"
               Text="User Name" />

    <TextBox Grid.Column="0"
             Grid.Row="3"
             Text="{Binding UseName}" />

    <TextBlock Grid.Column="0"
               Grid.Row="4"
               Text="Computer Name" />

    <TextBox Grid.Column="0"
              Grid.Row="5"
              Text="{Binding ComputerName}" />

    <TextBlock Grid.Column="0"
               Grid.Row="6"
               Text="PhoneNumber" />

    <TextBox Grid.Column="0"
              Grid.Row="7"
              Text="{Binding PhoneNumber}" />

    <TextBlock Grid.Column="0"
               Grid.Row="8"
               Text="Location" />

    <TextBox Grid.Column="0"
             Grid.Row="9"
             Grid.RowSpan="2"
             Text="{Binding Location}" />

    <Button Grid.Column="0"
            Grid.Row="11"
            Text="Copy All" />

    <!-- second column -->

    <TextBlock Grid.Column="1"
               Grid.Row="0"
               Text="Problem Description" />

    <Grid Grid.Column="1"
          Grid.Row="1">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="auto" />
      </Grid.ColumnDefinitions>    

      <TextBox Grid.Column="0"
               Text="{Binding ProblemDescription}" />    

      <Button Grid.Column="1"
              Content="C" />
    </Grid>

    <TextBlock Grid.Column="1"
               Grid.Row="2"
               Text="Notes" />

    <TextBox Grid.Column="0"
             Grid.Row="3"
             Grid.RowSpan="7"
             Text="{Binding Notes}" />    

    <TextBlock Grid.Column="1"
               Grid.Row="10"
               Text="Resolution" />

    <Grid Grid.Column="1"
          Grid.Row="11">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="auto" />
      </Grid.ColumnDefinitions>    

      <TextBox Grid.Column="0"
               Text="{Binding Resolution}" />    

      <Button Grid.Column="1"
              Content="C" />
    </Grid>

    <!-- splitter to make the columns resizable -->

    <GridSplitter Grid.Column="1"
                  Grid.Row="0"
                  Grid.RowSpan="12"
                  Width="3"
                  Background="Blue" />    
  </Grid>
</Window>
Автор: Shreyas Murali Размещён: 20.08.2016 08:29
Вопросы из категории :
32x32