C# WPF将用户控件放大,直到内部的ScrollViewer不再显示滚动条
我有一个名为MandatRichText的自定义 RichTextBoxes,位于一个 Grid 内,再嵌在一个 ScrollViewer 内,最终位于一个 UserControl 内。当用户对 UserControl 进行双击时,它需要逐渐放大,直到 Scrollviewer 的 scrollbar 消失。
我尝试使用 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>
这是代码。我也尝试过使用 DesiredSize 的 Grid 或者 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。