【问题标题】:Resize UserControl hosted in a Window with it's parent after initialization初始化后调整托管在其父窗口中的 UserControl 的大小
【发布时间】:2020-09-11 20:26:57
【问题描述】:

我正在使用一个窗口来承载几个不同的用户控件作为一个对话框。窗口基本上是这样的:

 <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>

在启动时,我的对话框具有托管用户控件中网格的大小。没关系。但是在调整外部窗口的大小时,用户控件内的网格​​将保持相同的静态设置大小。我希望外部窗口在初始化时具有内容的大小,然后使用外部窗口调整内容的大小。这可能吗?

谢谢

【问题讨论】:

  • 从行和列定义中删除高度和宽度。
  • 或使用'*'形式的高度/宽度
  • @AthulRaj 但是初始化时的大小不会是理想的
  • 设置所需的窗口高度/宽度。不是用户控件

标签: c# wpf


【解决方案1】:
  1. 如果您不总是希望它具有固定大小,请从 UserControl 的定义中删除 RowDefinitionsColumnDefinitions

  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>

【讨论】:

  • 谢谢 :) 初始大小可以这样设置,但是当窗口调整大小时,用户控件不会调整大小。即使窗口最大化到全屏,它也会保持初始宽度/高度值。
  • 不,不应该。 Window_SizeChangedRemoveInitialSizeConstraints 在调试代码时真的会被调用吗?他们将WidthHeight 属性设置为double.Nan,这意味着UserControl 不再具有固定大小。除非您在代码中的其他位置设置它的大小...
  • 我将高度/宽度设置为那里所需的初始大小,而不是 double.NaN。如果我将它设置为 NaN,它将从哪里获得初始大小?
  • @user3292642:哦,初始大小应该在 XAML 中设置。我以某种方式设法错过了将其包含在我的示例标记中。请参阅我在 XAML 的 ContentPresenter 元素中设置初始大小的编辑。
猜你喜欢
  • 1970-01-01
  • 2012-12-02
  • 2012-09-23
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2013-03-17
  • 2011-10-01
  • 1970-01-01
相关资源
最近更新 更多