【问题标题】:automatically move control if not visible on screen如果在屏幕上不可见,则自动移动控件
【发布时间】:2021-10-19 06:31:20
【问题描述】:

我有一个用户控件将通过左上角的按钮添加填充用户控件列表(父用户控件左侧的stackPanel),

插入许多用户控件后,屏幕将滚动,并且按钮添加将不可见 如果堆栈面板可见,我想将 stackPanel 顶部的按钮移动为可见 我找到了这个IsUserVisible 来检查按钮是否可见并且如果我从另一个按钮调用它是否可以工作,但我想让它自动我发现this 在 LayoutUpdated 事件触发时触发,但它会触发很多。 当用户向下滚动时,使按钮在堆栈面板中可见有什么帮助吗?

这是在添加第四个用户控件之前

添加第四个用户控件后,这将在屏幕上可见

按钮添加将不可见,我想移动到左侧 stackPanel 的可见顶部

编辑:

<Grid>
     <Grid.ColumnDefinitions>
         <ColumnDefinition MaxWidth="60" />
         <ColumnDefinition Width="*" />
     </Grid.ColumnDefinitions>
     <Grid Grid.Column="0">
         <Button x:Name="BtnAddNewUserControl" VerticalAlignment="Top"
                                Click="BtnAdd_OnClick"/>
     </Grid>

     <Grid Grid.Column="1">
        <StackPanel Name="StackPanelListUserControl" Orientation="Vertical">
        </StackPanel>
      </Grid>
  </Grid>

我不想让 StackPanelListUserControl 带有滚动(高度将随着内部 userControl 的数量而变化)然后在插入许多用户控件后,窗口将滚动显示最后插入的用户控件,在这种情况下是按钮BtnAddNewUserControl 将在屏幕上不可见,

编辑(在评论之后):

在评论 BionicCode 中要求只滚动右侧部分并修复左侧部分,这是我的解释:

我展示的只是它本身在一个可以添加的用户控件中,然后我的窗口有一个 stackPanelParent 接受许多 userControlParent,每个 userControlParent 都包含我正在展示的内容,为什么我不能在这个 userControlParent 中进行滚动显示 userControlChild,窗口会有 3-4 个 userControlParent 每个会有 6-7 个 userControlChild 我在 userControlParent 的左侧有按钮 –adduserControlParent-fix,但按钮 –adduserControlChild- 在 userControlParent 中

【问题讨论】:

  • 您想让堆栈面板可滚动还是只是使用 UserControls 的区域?
  • @OneTrickDragon 当屏幕上不可见时,我不会添加按钮以向下移动
  • 您可能必须重组您的 XAML 代码并使用 Grid 将您的控件分为可滚动和不可滚动的内容。
  • ScrollViewer 中移动Button?请发布您的 XAML 以获得更多帮助。
  • 将控件包装到自己的 Grid 中是多余的。在大型应用程序中这样做甚至会对渲染性能产生负面影响。始终尽量保持视觉树尽可能平坦。要解决您的问题,请使用 ListBox 而不是 StackPanel。您可以隐藏滚动条,但仍滚动其中的用户控件,而按钮将保持固定。关键是您正在滚动包含 Button 的完整 Grid - 这当然会将按钮移到视口之外。

标签: c# wpf


【解决方案1】:

您的代码不会滚动。这意味着在你的真实代码中你可能有一个ScrollViewer。你可能有 ScrollViewer 包围一切。这是 ScrollViewer 仅围绕 StackPanel ,然后可以按您的意愿工作 - 滚动仅滚动 StackPanelListUserControl 而不是 Button

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition MaxWidth="60" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid Grid.Column="0">
        <Button x:Name="BtnAddNewUserControl" VerticalAlignment="Top" Click="BtnAdd_OnClick">btn</Button>
    </Grid>
    <Grid Grid.Column="1">
        <ScrollViewer>
            <StackPanel Name="StackPanelListUserControl" Orientation="Vertical">
                <TextBlock FontSize="40">                    
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                    abc<LineBreak/>
                </TextBlock>
            </StackPanel>
        </ScrollViewer>
    </Grid>
</Grid>

【讨论】:

    【解决方案2】:

    您必须将命令按钮移出堆栈面板,并将堆栈面板放入滚动查看器中。

    由于您没有提供任何代码,因此我发布了一个示例:

    <Window x:Class="WpfApp1.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"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <DockPanel LastChildFill="True">
        <Button DockPanel.Dock="Top" Content="Add" Command="{Binding Path=AddControlCommand, Mode=OneTime}">
        </Button>
        <ScrollViewer>
            <StackPanel x:Name="myPanel">
                <UserControl Height="300" Content="Foo"/>
                <UserControl Height="300" Content="Bar"/>
                <UserControl Height="300" Content="Daz"/>
                <UserControl Height="300" Content="Please"/>
                <UserControl Height="300" Content="Get"/>
                <UserControl Height="300" Content="Vaccinated"/>
            </StackPanel>
        </ScrollViewer>
    </DockPanel>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多