C# WPF将用户控件放大,直到内部的ScrollViewer不再显示滚动条

编程语言 2026-07-07

我有一个名为MandatRichText的自定义 RichTextBoxes,位于一个 Grid 内,再嵌在一个 ScrollViewer 内,最终位于一个 UserControl 内。当用户对 UserControl 进行双击时,它需要逐渐放大,直到 Scrollviewerscrollbar 消失。

我尝试使用 Measure 命令,但它无法达到正确的大小。

这是Xaml:

<ScrollViewer Name="scrollcontainer" MinWidth="24" MinHeight="24" Margin="4,32,4,16" VerticalScrollBarVisibility="Auto"
              Padding="4" ScrollChanged="scrollcontainer_ScrollChanged">
    <Grid Name="whiteGrid" VerticalAlignment="Center">
        <Grid Name="textGrid" VerticalAlignment="Center" Grid.Row="2">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <local:MandatRichText x:Name="rtfTitle" Grid.Row="0" SelectionChanged="rtfTitle_SelectionChanged"/>
            <local:MandatRichText x:Name="rtfDiscussion" Grid.Row="1" SelectionChanged="rtfTitle_SelectionChanged"/>
        </Grid>
    </Grid>
</ScrollViewer>

这是代码。我也尝试过使用 DesiredSizeGrid 或者 UserControl,但都没有起作用:

private void userControl_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    if (scrollcontainer.ComputedVerticalScrollBarVisibility == Visibility.Visible)
    {
        double widthGap = scrollcontainer.DesiredSize.Width - scrollcontainer.ActualWidth;
        double heightGap = scrollcontainer.DesiredSize.Height - scrollcontainer.ActualHeight;

        this.Width += widthGap;
        this.Height += heightGap;
        Measure(scrollcontainer.DesiredSize);
    }
}

解决方案

我假设你有如下布局

<UserControl x:Class="SomeNamespace.SomeUserControl"
             ------------------------
             MouseDoubleClick="userControl_MouseDoubleClick">

    <ScrollViewer Name="scrollcontainer" MinWidth="24" MinHeight="24" Margin="4,32,4,16" VerticalScrollBarVisibility="Auto"
                  Padding="4" ScrollChanged="scrollcontainer_ScrollChanged">
        <!-- Some content -->
    </ScrollViewer>

</UserControl>

需要执行的操作(如果我理解正确的话):

  • 在初始状态下,ScrollViewer的内容部分可见且可滚动。
  • 被双击时,内容应扩展到全尺寸,类似于没有ScrollViewer时的状态。
  • 再次单击时,应返回到原始状态。

我的提议解决方案。 布局:

<UserControl x:Class="SomeNamespace.SomeUserControl"
             ----------------------
             MouseDoubleClick="userControl_MouseDoubleClick">

    <!-- Main ContentControl handles external margins, sizes, and explicit border thickness -->
    <ContentControl x:Name="mainControl"
                    Margin="4,32,4,16" 
                    Padding="4"
                    BorderThickness="1"
                    BorderBrush="LightGray">  <!-- Set the required size (Thickness) and color here -->

        <!-- ScrollViewer is now borderless and has no extra margins -->
        <ScrollViewer Name="scrollcontainer"
                      MinWidth="24" 
                      MinHeight="24" 
                      Margin="0" 
                      Padding="0" 
                      BorderThickness="0"
                      Background="Transparent"
                      VerticalScrollBarVisibility="Auto"
                      ScrollChanged="scrollcontainer_ScrollChanged">

            <!-- Some content -->

        </ScrollViewer>
    </ContentControl>

</UserControl>

处理程序代码:

private ScrollViewer _scrollContainerField;

private void userControl_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    if (_scrollContainerField == null)
    {
        _scrollContainerField = scrollcontainer;
        object content = _scrollContainerField.Content;

        _scrollContainerField.Content = null;
        mainControl.Content = content;
    }
    else
    {
        object content = mainControl.Content;

        mainControl.Content = null;
        _scrollContainerField.Content = content;
        mainControl.Content = _scrollContainerField;

        _scrollContainerField = null;
    }

    e.Handled = true;
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章