解决 ScrollViewer没有'处理动态创建的内容

沃尔夫

成员
已加入
2020年4月26日
留言内容
12
编程经验
Beginner
嗨,我在scrollviewer中有一个dockPanel。
在该扩展面板中,我创建了许多按钮,然后发生的事情是,scrollviewer根本不响应,新按钮仅在应用程序中进行了剪辑。
(当我调整应用程序的大小时,它们会被裁剪)。
我找不到任何有关如何正确设置的说明。
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
控件的顺序可以很好地协同工作。显示您的Xaml,并仅显示创建和初始化这些新控件的相关代码。如果您没有问题,也欢迎提供问题的屏幕截图...
 

沃尔夫

成员
已加入
2020年4月26日
留言内容
12
编程经验
Beginner
控件的顺序可以很好地协同工作。显示您的Xaml,并仅显示创建和初始化这些新控件的相关代码。如果您没有问题,也欢迎提供问题的屏幕截图...
XAML part:
       <ScrollViewer VerticalScrollBarVisibility="Auto">
            <DockPanel HorizontalAlignment="Left" Height="419" VerticalAlignment="Top" Width="134" LastChildFill="False">
               <Button x:Name="showDinner" Content="Dinner" Height="39" VerticalAlignment="Top" DockPanel.Dock="Top" Click="showDinner_Click"/>
                <StackPanel x:Name="dinnerPanel" Visibility="Collapsed" Height="auto" VerticalAlignment="Top" Width="134" HorizontalAlignment="Left" DockPanel.Dock="Top"/>
            </DockPanel>
        </ScrollViewer>
button creation:
                Button button = new Button();

                button.Content = title;
                button.Name = title;
                button.Click += (sender, e) => readRecipe(sender, e, title);
                breakfastPanel.Children.Add(button);
捕获.png
滚动条保持不变,下一个按钮在窗口中进行剪辑。调整窗口大小不会改变按钮的任何内容,但是在创建按钮并调整窗口大小之前,滚动条允许我滚动,但这仅仅是因为原始控件不合适。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
啊,有趣。

顺便说一句,为什么要通过过程性添加控件来使用旧的WinForms方法,而使控件保存数据的旧的Win32方法呢?应该使用WPF的方式是使用MVVM模式。因此,在这种情况下,您可以将新项目添加到可观察的集合中,并且该集合绑定到使用按钮的项目模板填充其内容的堆栈面板。
 

沃尔夫

成员
已加入
2020年4月26日
留言内容
12
编程经验
Beginner
我的意思是我已经学习c#大约一个月了,所以我真的不知道WinForms是哪种方式,哪种WPF以及MVVM模式或集合实际上是什么。我只是用JavaScript来做的,这似乎是最简单的方法。因此,滚动条实际上​​没有任何理由不起作用(除了它不知道该怎么办,因为我不做我期望的事情)?同样,如果您能指出一些正确方法来做这些事情的教程/页面,我将非常感谢。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
在这一点上,我不知道为什么堆栈面板没有让底座面板调整其大小,因此底座面板没有告诉滚动查看器它正在调整大小,因此需要重新计算滚动条。
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
看来您正在尝试创建以下内容:

截屏_129.jpg

目前我没有很多空闲时间,但是如果您有任何疑问,我将在有机会的时候回复。基本上使用网格并使用列跨度,可以在定义Grid.Row / Column定义的网格的各个部分之间移动。在下面查看我的简短示例。它可能会给您一个更好的方向:
C#:
    <Grid x:Name="MainGrid" Margin="10,10,10,10">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="30*"/>
            <ColumnDefinition Width="80*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Grid Grid.Column="0" Width="180"  Grid.Row="0" Margin="0,10,557,9" Grid.ColumnSpan="2" Grid.RowSpan="2">
            <Grid.Background>
                <SolidColorBrush Color="Beige"/>
            </Grid.Background>
            <Rectangle Margin="10,10,10,10" Fill="WhiteSmoke" RadiusY="10" RadiusX="10" Width="162" Height="300">
                <Rectangle.Effect>
                    <DropShadowEffect BlurRadius="20" Color="#FFDEDEDE" RenderingBias="Quality" ShadowDepth="1"/>
                </Rectangle.Effect>
            </Rectangle>
          
            <ScrollViewer Height="270" Width="160" Name="leftBarScroll" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
                <StackPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="80" Margin="30,30,30,30" Height="Auto">
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                </StackPanel>
            </ScrollViewer>
        </Grid>
        <Grid Grid.Column="1" Grid.ColumnSpan="2" Background="Aqua">
          
        </Grid>
    </Grid>
我没有在源中添加任何评论,但是如果您需要了解一些信息。只需引用一段代码,下一次我登录时我会回复您。

顺便说一句,使用WPF而不是Winforms为您致敬。我喜欢看到人们与时俱进。

编辑-为表格的第二列添加了更清洁的xaml:
C#:
    <Grid x:Name="MainGrid" Margin="10,10,10,10">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="30*"/>
            <ColumnDefinition Width="80*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Grid Grid.Column="0" Width="180"  Grid.Row="0" Margin="0,10,557,9" Grid.ColumnSpan="2" Grid.RowSpan="2">
            <Grid.Background>
                <SolidColorBrush Color="Beige"/>
            </Grid.Background>
            <Rectangle Margin="10,10,10,10" Fill="WhiteSmoke" RadiusY="10" RadiusX="10" Width="162" Height="300">
                <Rectangle.Effect>
                    <DropShadowEffect BlurRadius="20" Color="#FFDEDEDE" RenderingBias="Quality" ShadowDepth="1"/>
                </Rectangle.Effect>
            </Rectangle>
           
            <ScrollViewer Height="270" Width="160" Name="leftBarScroll" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
                <StackPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="80" Margin="30,30,30,30" Height="Auto">
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                    <Button Content="b1"></Button>
                </StackPanel>
            </ScrollViewer>
        </Grid>
        <Grid Grid.Column="1" Grid.Row="0" Grid.RowSpan="1" Grid.ColumnSpan="2" Background="Aqua" Margin="10,10,10,10" Height="Auto">
           
        </Grid>
    </Grid>

 
Last edited:

沃尔夫

成员
已加入
2020年4月26日
留言内容
12
编程经验
Beginner
好的,我不知道您如何解决它,但是您非常感谢!
它可能与以下任一有关:
将其放在网格列中,我也做了,但事实并非如此't反映在代码(?)中:
 <Grid Grid.Column="0" Width="180"  Grid.Row="0" Margin="0,10,557,9" Grid.ColumnSpan="2" Grid.RowSpan="2">
对于网格列,在我仅将其捕捉到设计窗口中的网格之前,我以为它可以工作,但是它没有反映在代码中,因此我不确定它是否起作用。我仍然不太明白为什么XAML反映了设计窗口中的某些更改而为什么没有。
将scrollViewer置于固定高度:
<ScrollViewer Height="270" Width="160">
我在自动上具有ScrollViewer高度,因为我认为它需要Stretch(?),但是现在我看到它需要像代码中一样固定,这样滚动条才能工作-因为没有更多空间了。
将对接面板的高度设置为自动:
<DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="80" Margin="30,30,30,30" Height="Auto">
DockPanel's height I had fixed because I thought it would clip through the app (which it did either way) if I let it stretch as much as it wanted to. But now I understand that it should be allowed to stretch in height as much as it needs to 因为它在固定高度的scrollViewer容器中which purpose is to let the user scroll the 'longer-than-app' panels.

请,如果可以的话,请让我知道我对这次为何有效的假设是否正确,谢谢!
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
如果您只是阅读xaml,这有点简单。获取网格的定义。这些项目的大小必须在此处设置正确的值,因为如果网格或堆栈面板中的项目的宽度或高度大于此处设置的值,则这些项目的大小将不会调整:
C#:
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="30*"/>
            <ColumnDefinition Width="80*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
如您所见,我们有两列,只有一行。从上到下一行。列从左到右。因此,当我们设置以下定义时,我们将为网格控件添加两列:
C#:
            <ColumnDefinition Width="30*"/>
            <ColumnDefinition Width="80*"/>
C#:
                <Grid Grid.Column="0" Width="180"  Grid.Row="0" Margin="0,10,557,9" Grid.ColumnSpan="2" Grid.RowSpan="2">
Grid.ColumnSpan sets the number of columns that a child item can span. When using the grid control it is important to use columnspan too, because this allows us to control how many column items can reside in each one. Most people use other controls and use dockers to avoid having to manually do the extra legwork involved when using a grid layout like mine. But its worth writing the extra code! As you can see, you can use the grid control to achieve similar functionality. Anyway, the next bit opens up the option to set individual properties on this grid, since we are still operating inside of its closing tag </grid> :
C#:
            <Grid.Background>
                <SolidColorBrush Color="Beige"/>
            </Grid.Background>
不言自明,因为它设置了此网格列和行的背景,因为它们都设置为0。零是实际网格布局本身的第一列:
C#:
             Grid Grid.Column="0"
同样适用于行:
C#:
             Grid.Row="0"
如果我们将这些值更改为1,它将移动以在下一个ColumnDefinition / RowDefinition上设置属性。 (如果还有其他的Rows。我们只定义了一个Rows。)接下来,我添加了一个仅用于样式的矩形,因为它使UI看起来更加令人印象深刻,尤其是在那些圆角弯曲的情况下:
C#:
            <Rectangle Margin="10,10,10,10" Fill="WhiteSmoke" RadiusY="10" RadiusX="10" Width="162" Height="300">
                <Rectangle.Effect>
                    <DropShadowEffect BlurRadius="20" Color="#FFDEDEDE" RenderingBias="Quality" ShadowDepth="1"/>
                </Rectangle.Effect>
            </Rectangle>
接下来,当我们仍处于第一个网格定义的相同网格范围内时,我们将scrollviewer添加到该相同的ColumnDefinition:
C#:
                <ScrollViewer Height="270" Width="160" Name="leftBarScroll" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
这里重要的部分是使用StackPanel,而不是用于将此面板的子项垂直堆叠在项目上的DockPanel:
C#:
                <StackPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="80" Margin="30,30,30,30" Height="Auto">
Note that : VerticalAlignment="Stretch" HorizontalAlignment="Stretch" helps the child items to sit comfortably according to their own size. Then we add the buttons to this item. Finishing up, we have added the second Column Grid.ColumnDefinitions to the xaml :
C#:
        <Grid Grid.Column="1" Grid.Row="0" Grid.RowSpan="1" Grid.ColumnSpan="2" Background="Aqua" Margin="10,10,10,10" Height="Auto">

        </Grid>
希望这可以帮助您了解其工作原理。如果您还有其他疑问,则需要等待其他人中的一个加入。第二天左右我将离开。 ;)
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
答案在第11、21、22行,并且已经向您解释了。您需要阅读我已经提供的说明。
我在自动上的ScrollViewer高度,因为我认为它需要拉伸(?)
它应该受到绑定的约束,您实际上只能使用MVVM方法适当地做到这一点。滚动查看器应设置为适合其父对象的大小。
但是现在我知道应该允许它拉伸到所需的高度,因为它在固定高度的scrollViewer容器中
面板(在这种情况下)是堆叠面板。而且它比扩展坞面板更合适。因为您不是要一个接一个地停放子项,所以您想要堆叠它们。如果要放置间距,则需要为此添加一个边距。

最后,不允许滚动查看器扩展到所需的程度,也没有任何选择允许它扩展,就我所知。但是,它是子控件-堆栈面板需要能够在高度和宽度上进行拉伸,因为它的滚动查看器将补偿当面板随着添加的子控件扩展时需要多少滚动。也就是说,您位于其中的按钮会导致面板扩展...

我现在没有很多空闲时间,所以希望您能得到。您还应该知道,任何子控件的所有父项都将决定其所有子控件的最大高度/宽度,无论这些子控件的参数是什么。
 

沃尔夫

成员
已加入
2020年4月26日
留言内容
12
编程经验
Beginner
您需要阅读我已经提供的说明。
您说的是这样,但是您也没有真正阅读我写的内容。我说"因为它在固定高度的scrollViewer容器中"然后你就告诉我"不,不应允许scrollviewer拉伸"。是的,我知道我只是这么说,只想要确认。我在谈论应该如何扩展ockerPanel,因为scrollviewer会补偿。
答案在第11、21、22行,并且已经向您解释了。
无需粗鲁,我从字面上询问了这些行,只想确认我意识到的正确。
不管怎么说,还是要谢谢你。
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
您说的是这样,但是您也没有真正阅读我写的内容。

如果我不读您写的内容,则不会回复给您突出显示该部分。我可以吗?您需要对以下属性进行一些研究 MSDN搜索。重新报价:
Note that : VerticalAlignment="Stretch" HorizontalAlignment="Stretch" helps the child items to sit comfortably according to their own size.

然后,您回来后问我同样的事情,因为我解释了当时的XAML发生了什么。因此,让我详细说明您的问题:
我在自动上具有ScrollViewer高度,因为我认为它需要Stretch(?),但是现在我看到它需要像代码中一样固定,这样滚动条才能工作-因为没有更多空间了。
There are a number of factors to consider when setting the size of a control. These size settings depend on what properties you've set on parent controls. This should have been evident to you when I set the Grid Definitions with a star asterisk, unless you don't know what setting an asterisk does when placed after a value... Oh and also; to correct myself. The scroll viewer does have properties for setting vertical/horizontal alignment to stretch. But you would be best using min/max width/height if you plan on allowing the alignment properties to be set to stretch. So they can only stretch up until a min/max point in size. You might also find this helpful regarding why I set the Grid.ColumnDefinitions with * - See : WPF ColumnDefinition中*(星号)的含义? -您也可以避免设置高度和宽度,这与在旧Winforms中使用填充等效。但是,如果滚动查看器的父控件具有固定的高度和宽度属性尺寸,则可以推翻此规则。然后,滚动查看器将仅调整自身大小为其父级。

爵士乐如何为您的问题提供足够体面的答案?

我在谈论应该如何扩展ockerPanel,因为scrollviewer会补偿。

如果还没有出现在你身上。我没有使用底座面板,而是使用了具有不同特征行为的堆叠面板。在声明的后面,是的。

无需粗鲁,我从字面上询问了这些行,只想确认我意识到的正确。
不管怎么说,还是要谢谢你。

最后,我并不粗鲁。你还没有看到我很粗鲁。因此,尽量不要在两行之间阅读过多。

我显然是在将您带回到负责改变您所质疑的行为的界限。无需科学家更改一些值即可进行实验,以查看由在xaml中设置替代参数值引起的某些不同行为。您还应该注意,我在项目中不再有该代码。因此,从这里进行复制和粘贴只是为了测试一些新功能,这是您的麻烦,而这些新功能使您无法胜任自己的工作。您还应该注意,我不是您的付费导师,也听不到像给婴儿喂奶那样向您灌输信息。因此,当我不在时,不要将玩具扔出婴儿车,并指责我粗鲁。我一直很礼貌地给你尽可能多的东西。

您还应该知道自己在公开场合 自助 网站。这意味着,您需要自助。而且,任何用户在此板上向您提供的任何代码贡献或示例都是出于慷慨之举,我们也没有义务向您提供任何此类示例。进一步期望您在返回并提出其他问题之前,对所获得的内容进行自己的研究。通过简单的Google搜索xaml星号即可显示有助于您解决问题的有用信息。我们没有为我们的捐款获得报酬,请注意,我们并非总是有时间写答复来解释每个小细节。这就是为什么您有手指和搜索引擎。
 

沃尔夫

成员
已加入
2020年4月26日
留言内容
12
编程经验
Beginner
耶稣基督,你会得到这个吗?
把玩具扔出去
你以为你是谁?
您还应该注意,我不是您的付费导师,也听不到像给婴儿喂奶那样向您灌输信息。
没有人要求您回答,所以不要再哭了。谈论坐在一匹高高的马上。
什么细节?有人说"yes" or "no"我的问题很好。而且,如果您阅读了该问题,将会给出一个简短的简单答案,尤其是因为您是如此"short on time".
您选择写50个句子。
你还没有看到我很粗鲁。
不需要科学家
我不是您的带薪导师,也听不到给您喂食的信息
throwing your toys
是的,这根本不是粗鲁或被动的进取。如果您不想提供帮助,那就不要。
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
答案在第11、21、22行,并且已经向您解释了。
这不是不礼貌的做法,它告诉您在哪里可以找到所问问题的答案,而这在xaml中已得到明显解释。然后,您继续指责我不礼貌,但事实并非如此:
无需粗鲁,我从字面上询问了这些行,只想确认我意识到的正确。
不管怎么说,还是要谢谢你。
尽管您指责不礼貌;我继续在上面对您进行了更详细的解释,现在您回到挑剔的讨论中来。 :哈哈:
没有人要求您回答,所以不要再哭了。谈论坐在一匹高高的马上。
现在你很粗鲁。而且我没有高高在上。如果是的话,我会以夸大的言论和指责来结束您的话题,使话题脱节。相反,我要求您保留关于您的问题的话题,而不是关于我的话题或无关紧要的指控。

这就是我一直的样子。如果您不喜欢它,那该死的狗屎。到目前为止,我对您一直没有礼貌。欢迎您报告您认为不礼貌的帖子,管理员会在有时间时为您查看这些帖子。我不会再对此作任何答复,所以让它留在那里。除非您继续进行恶作剧,否则您的主题将保持打开状态。

实际上,我之所以回答您,是因为您没有收到其他成员的答复。可能是因为他们希望您也可以进行一些谷歌搜索。我一直在回礼。但是我以后不会犯这个错误。 ;)
 
最佳 底部