【问题标题】:How to disable resizing of a UserControl in WPF如何在 WPF 中禁用用户控件的大小调整
【发布时间】:2020-05-14 12:55:53
【问题描述】:

如何:

  1. 禁用此用户控件的大小调整。换句话说,当用户用鼠标抓住这个用户控件的角或边时,我不希望用户能够改变用户控件的大小?
  2. 或者如果没有办法停止调整大小,那么我如何只允许拖动用户控件的右侧?
  <UserControl x:Class="MyEditor.MyDialog"
         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" 
         d:DesignHeight="152" d:DesignWidth="590" HorizontalContentAlignment="Right" MinWidth="{Binding ElementName=VariableType}" MinHeight="{Binding RelativeSource={RelativeSource Self}}">
<Grid Width="591" Height="147" MinWidth="{Binding ElementName=VariableTypeTextBox}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="137*" />
        <ColumnDefinition Width="454*" MinWidth="250" />
    </Grid.ColumnDefinitions>
    <Button Content="Cancel" Height="23" Margin="0,94,7,0" Name="CancelButton" VerticalAlignment="Top" Click="CancelButton_Click" Grid.Column="1" HorizontalAlignment="Right" Width="75" HorizontalContentAlignment="Center" VerticalContentAlignment="Top" />
    <Button Content="Create" Height="23" Margin="0,94,108,0" Name="CreateButton" VerticalAlignment="Top" Click="CreateButton_Click" Grid.Column="1" HorizontalAlignment="Right" Width="75" HorizontalContentAlignment="Center" VerticalContentAlignment="Top" />
    <Label Content="Variable Name " Height="28" Margin="0,12,29,0" Name="VariableName" VerticalAlignment="Top" HorizontalAlignment="Right" Width="96" Target="{Binding}" HorizontalContentAlignment="Right" />
    <TextBox Height="29" Margin="0,11,7,0" Name="VarNameTextBox" VerticalAlignment="Top" KeyDown="OnKeyDownHandler" MouseLeave="MouseLeaveHandler" LostFocus="LostFocusHandler" Grid.Column="1" HorizontalAlignment="Stretch" />
    <Label Content="Variable Type" Height="28" Margin="0,0,29,73" Name="VariableType" VerticalAlignment="Bottom" HorizontalContentAlignment="Right" HorizontalAlignment="Right" Width="96" />
    <TextBox Height="23" Margin="0,51,7,0"  Name="VariableTypeTextBox" VerticalAlignment="Top" IsReadOnly="True" Background="Silver" Foreground="Black" Grid.Column="1" HorizontalAlignment="Stretch"  Width="AUTO" />
</Grid>

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    您已为 UserControl 粘贴了 XAML,但您的问题是关于 Window。因此,您需要将 UserControl 放置在设置为不允许调整大小的 Window 中。

    WPF 窗口有一个 ResizeMode 属性,可以是以下之一:

    • 不调整大小
    • 可以最小化
    • 可以调整大小(默认)
    • CanResizeWithGrip

    您将需要 NoResize。

    例子:

    <Window x:Class="MyEditor.Views.EditorWindow"
            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"
            xmlns:views="clr-namespace:MyEditor"
            mc:Ignorable="d"
            ResizeMode="NoResize"
            Title="Editor Window">
        <views:MyDialog />
    </Window>
    

    更多详情请查看documentation

    【讨论】:

    • 谢谢。我确实也放了我的 qyestion 用户控件。
    • 将您的 UserControl 放在窗口中是否有效,正如我在回答中所展示的那样?
    • 它崩溃了,因为我在代码中创建了一个用户控件,但现在我正在创建一个窗口。如果有办法使用户控件不可调整大小,那将是所需的路径。有任何想法吗?提前致谢。
    • 您谈到用户通过抓住用户控件的边/角来执行调整大小,但用户控件没有调整大小的功能,只有窗口有。因此,您的应用程序中的某处必须有一个包含您的用户控件的窗口。如果您想完全阻止用户调整应用程序窗口的大小,您需要在窗口级别强制执行此操作。如果您只是希望您的用户控件是固定大小,您可以设置它的 MinWidth/MaxWidth 和 MinHeight/MaxHeight,但这不会阻止用户将窗口缩小到覆盖您的用户控件。
    • 我正在调用一个窗口来调用我的 UserControl:Window window = new Window { Title = "Create New Activity Variable", Content = new NewVariableDialog(activity,modelService, _editor.SelectedVarTypeOnInspectorPane),SizeToContent= SizeToContent .WidthAndHeight, ResizeMode= ResizeMode.NoResize }; window.WindowStartupLocation = WindowStartupLocation.CenterScreen ; window.ShowDialog();
    【解决方案2】:

    只需将 MinWidth/MaxWidth 和 MinHeight/MaxHeight 属性设置为所需的值。

    【讨论】:

    • 谢谢。我为 UserControl 设置了 Max 和 Min,但这不起作用。
    【解决方案3】:

    禁用:ResizeMode="CanMinimize"

    <Window x:Class="XXXXXX.MainWindow"
            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:local="clr-namespace:XXXXXXX"
            mc:Ignorable="d"
            WindowState="Maximized"
            ResizeMode="CanMinimize"
            Title="Window">
    

    【讨论】:

      【解决方案4】:

      这是一个简单的解决方案:

      private void UserControl_Loaded(object sender, RoutedEventArgs e)
      {
          ((Window)Parent).ResizeMode = ResizeMode.NoResize;
      }
      

      如果您使用 Prism 库,则为 UserControl 上的附加属性:

      <prism:Dialog.WindowStyle>
          <Style TargetType="Window">
              <Setter Property="prism:Dialog.WindowStartupLocation" 
                  Value="CenterScreen" />
              <Setter Property="ResizeMode" Value="NoResize"/>
              <Setter Property="ShowInTaskbar" Value="False"/>
              Setter Property="SizeToContent" Value="WidthAndHeight"/>
          </Style>
      </prism:Dialog.WindowStyle>
      

      【讨论】:

      • 这会阻止父窗口的大小调整,但 OP 想要阻止 UserControl 本身调整大小。此外,这假设 UserControl 的父级是 Window,但情况可能并非如此。
      • @Optimax:该问题旨在防止用户在运行时使用鼠标调整 UserControl 的大小。 UserControl 必须托管在 Window 中才能发生这种情况。运行时用户不能直接访问 UserControl。因此,我建议的解决方案是有效的。另一种解决方案是在 UserControl 上添加附加属性,如我的附加答案所示。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多