如何在WPF中禁用UserControl的调整大小

22

如何:

  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>
4个回答

45

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

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

  • NoResize
  • CanMinimize
  • CanResize(默认)
  • 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>

请参阅文档以获取更多详细信息。


谢谢。我也在我的用户控件中加入了“n”。 - user1298925
它总是崩溃,因为在代码中我创建了一个UserControl,但现在我正在创建一个Window。如果有一种方法可以使用户控件不可调整大小,那将是期望的路径。有什么想法吗?提前致谢。 - user1298925
你提到用户通过抓住用户控件的边角来执行调整大小,但是用户控件没有调整大小的功能,只有窗口才有。因此,在您的应用程序中必须有一个包含您的用户控件的窗口。如果您想完全防止用户调整应用程序窗口的大小,则需要在窗口级别强制执行该操作。如果您只想让您的用户控件具有固定的大小,您可以设置其MinWidth/MaxWidth和MinHeight/MaxHeight,但这不会防止用户缩小窗口,以至于覆盖您的用户控件。 - devuxer
我正在调用一个窗口来调用我的用户控件:Window window = new Window { Title = "创建新的活动变量", Content = new NewVariableDialog(activity,modelService, _editor.SelectedVarTypeOnInspectorPane ),SizeToContent= SizeToContent.WidthAndHeight, ResizeMode= ResizeMode.NoResize }; window.WindowStartupLocation = WindowStartupLocation.CenterScreen ; window.ShowDialog(); - user1298925
所以我使用了 DanM ResizeMode = NoResize,它起作用了。@DanM:非常感谢您的跟进解决问题和解释。 - user1298925
显示剩余2条评论

3

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


谢谢。我为UserControl设置了最大值和最小值,但是没有起作用。 - user1298925

2

禁用方法: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">

0
这里是一个简单的解决方案:
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>

1
这可以防止父窗口的调整大小,但 OP 想要防止 UserControl 本身的调整大小。此外,这假定 UserControl 的父级是 Window,但可能并非如此。 - Optimax
@Optimax:该问题旨在防止用户在运行时使用鼠标调整UserControl的大小。为此,UserControl必须托管在窗口中。运行时用户无法直接访问UserControl。因此,我的建议解决方案是有效的。另一种解决方案是在UserControl上添加附加属性,如我额外的答案所示。 - geodeasic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接