Изменение размера пользовательского элемента управления, размещенного в окне с его родительским элементом после инициализации

#c# #wpf

#c# #wpf

Вопрос:

Я использую окно для размещения нескольких разных пользовательских элементов управления в виде диалогового окна. Окно в основном выглядит так:

  <Window x:Class="GenericWindow"
        x:Name="BaseDialog"
        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"
        mc:Ignorable="d"
        WindowStartupLocation="CenterScreen"
        d:DataContext="{d:DesignInstance Type=wpfDialogs:DialogViewModel, 
IsDesignTimeCreatable=True}"
        Title="{Binding Title}"
        SizeToContent="WidthAndHeight"
        MinWidth="400" MinHeight="400"
        WindowStyle="ToolWindow"
        ResizeMode="CanResizeWithGrip"
        Loaded="Window_Loaded">

    <Grid.RowDefinitions>
       <RowDefinition Height="*" />
      <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <ContentPresenter Grid.Row="0" Margin="10 10 10 0" Content="{Binding}"/>

 </Window>
  

Мой пользовательский элемент управления выглядит следующим образом:

 <UserControl x:Class="PickControl"
    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:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
    xmlns:dxprg="http://schemas.devexpress.com/winfx/2008/xaml/propertygrid"        
    xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"        
    mc:Ignorable="d"
    x:Name="mainWindow">

  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height ="600" MinHeight="200"/>
      <RowDefinition Height ="15"/>
      <RowDefinition Height ="400" MinHeight="100"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
  <ColumnDefinition Width ="700"/>
</Grid.ColumnDefinitions>


<-- content goes here -->
</UserControl>
  

При запуске мой диалог имеет размер сетки в размещенном пользовательском элементе управления. Все в порядке. Но при изменении размера внешнего окна сетка внутри пользовательского элемента управления останется прежнего размера. Я хочу, чтобы внешнее окно имело размер содержимого при инициализации, а после этого содержимое изменялось вместе с внешним окном. Возможно ли это?

Спасибо

Комментарии:

1. удалите высоту и ширину из определений строк и столбцов.

2. или используйте высоту / ширину в терминах ‘*’

3. @AthulRaj но тогда размер при инициализации не будет желаемым

4. установите желаемую высоту / ширину для окна. не пользовательский элемент управления

Ответ №1:

  1. Избавьтесь от RowDefinitions и ColumnDefinitions из определения UserControl , если вы не всегда хотите, чтобы оно имело фиксированный размер.

  2. Установите его начальный размер в окне, а затем дважды обработайте SizeChanged событие:

      private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
     {
         SizeChanged -= Window_SizeChanged;
         SizeChanged  = RemoveInitialSizeConstraints;
     }
    
     private void RemoveInitialSizeConstraints(object sender, SizeChangedEventArgs e)
     {
         cc.Height = double.NaN;
         cc.Width = double.NaN;
         SizeChanged -= RemoveInitialSizeConstraints;
     }
      

XAML:

 <Window x:Class="GenericWindow"
        x:Name="BaseDialog"
        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"
        mc:Ignorable="d"
        WindowStartupLocation="CenterScreen"
        d:DataContext="{d:DesignInstance Type=wpfDialogs:DialogViewModel, 
IsDesignTimeCreatable=True}"
        Title="{Binding Title}"
        SizeToContent="WidthAndHeight"
        MinWidth="400" MinHeight="400"
        WindowStyle="ToolWindow"
        ResizeMode="CanResizeWithGrip"
        Loaded="Window_Loaded"
        SizeChanged="Window_SizeChanged">

    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <ContentPresenter x:Name="cc" Grid.Row="0" Margin="10 10 10 0" Content="{Binding}"
                      Height ="600" MinHeight="200" Width="700"/>

</Window>
  

Комментарии:

1. спасибо 🙂 Начальный размер может быть установлен следующим образом, но пользовательский элемент управления не будет изменять размер при изменении размера окна. Он останется с начальными значениями ширины / высоты, даже если окно развернуто до полноэкранного режима.

2. Нет, это не должно. Действительно ли Window_SizeChanged и RemoveInitialSizeConstraints вызываются при отладке кода? Они устанавливают для Width и Height свойств значение double.Nan , что означает, что UserControl больше не имеет фиксированного размера. Если вы не установите его размер где-то еще в своем коде…

3. Вместо double. NaN, я установил там высоту / ширину на желаемый начальный размер. Если я установлю для него значение NaN, откуда он получит начальный размер?

4. @user3292642: О, начальный размер должен быть установлен в XAML. Мне каким-то образом удалось пропустить включение этого в мой пример разметки. Смотрите мою правку, где начальный размер задан в ContentPresenter элементе в XAML.