#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:
-
Избавьтесь от
RowDefinitions
иColumnDefinitions
из определенияUserControl
, если вы не всегда хотите, чтобы оно имело фиксированный размер. -
Установите его начальный размер в окне, а затем дважды обработайте
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.