Panel in a panel, autoscroll

风格不统一 提交于 2019-12-12 04:58:28

问题


I'm doing a minimalist test app after encountering an issue with my real program, using WinForms. I put a small panel (child) inside a bigger panel (parent). The bigger panel has AutoScroll set to true. The child panel has the default Anchors set to Top and Left. The child panel is not docked.

The behavior I want is for scrollbars to appear whenever the smaller panel's location is too offset, either top, bottom, left or right. The problem is that it only works when it's too far right, or too far in the bottom. No scrollbars appear when it's too much in the top or too much in the left directions.

I use two simple buttons to force the child panel's location 200 pixels to the left, or 200 pixels to the right to have a quick way of easily modifying its position.

Here's my Form1() code:

        private void button1_Click(object sender, EventArgs e)
    {
        childPanel.Location = new Point(childPanel.Location.X - 200, childPanel.Location.Y);
        hostPanel.Invalidate();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        childPanel.Location = new Point(childPanel.Location.X + 200, childPanel.Location.Y);
        hostPanel.Invalidate();
    }

Here's the designer code:

       private void InitializeComponent()
    {
        this.hostPanel = new System.Windows.Forms.Panel();
        this.childPanel = new System.Windows.Forms.Panel();
        this.moveChildLeft = new System.Windows.Forms.Button();
        this.moveChildRight = new System.Windows.Forms.Button();
        this.hostPanel.SuspendLayout();
        this.SuspendLayout();
        // 
        // hostPanel
        // 
        this.hostPanel.AutoScroll = true;
        this.hostPanel.BackColor = System.Drawing.SystemColors.AppWorkspace;
        this.hostPanel.Controls.Add(this.childPanel);
        this.hostPanel.Location = new System.Drawing.Point(239, 48);
        this.hostPanel.Name = "hostPanel";
        this.hostPanel.Size = new System.Drawing.Size(400, 400);
        this.hostPanel.TabIndex = 0;
        // 
        // childPanel
        // 
        this.childPanel.BackColor = System.Drawing.SystemColors.ButtonHighlight;
        this.childPanel.Location = new System.Drawing.Point(29, 62);
        this.childPanel.Name = "childPanel";
        this.childPanel.Size = new System.Drawing.Size(342, 259);
        this.childPanel.TabIndex = 0;
        // 
        // moveChildLeft
        // 
        this.moveChildLeft.Location = new System.Drawing.Point(61, 81);
        this.moveChildLeft.Name = "moveChildLeft";
        this.moveChildLeft.Size = new System.Drawing.Size(75, 23);
        this.moveChildLeft.TabIndex = 1;
        this.moveChildLeft.Text = "Left 200";
        this.moveChildLeft.UseVisualStyleBackColor = true;
        this.moveChildLeft.Click += new System.EventHandler(this.button1_Click);
        // 
        // moveChildRight
        // 
        this.moveChildRight.Location = new System.Drawing.Point(61, 111);
        this.moveChildRight.Name = "moveChildRight";
        this.moveChildRight.Size = new System.Drawing.Size(75, 23);
        this.moveChildRight.TabIndex = 2;
        this.moveChildRight.Text = "Right 200";
        this.moveChildRight.UseVisualStyleBackColor = true;
        this.moveChildRight.Click += new System.EventHandler(this.button2_Click);
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(1018, 549);
        this.Controls.Add(this.moveChildRight);
        this.Controls.Add(this.moveChildLeft);
        this.Controls.Add(this.hostPanel);
        this.Name = "Form1";
        this.Text = "Form1";
        this.hostPanel.ResumeLayout(false);
        this.ResumeLayout(false);
    }

回答1:


Yet - Another Winforms incapability quickly solved by WPF:

XAML:

<Window x:Class="WpfApplication4.Window3"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window3" WindowState="Maximized">
    <DockPanel>
        <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
            <Button Content="Left" Click="MoveLeft"/>
            <Button Content="Right" Click="MoveRight"/>
        </StackPanel>
        <Border BorderBrush="Blue" BorderThickness="1" Width="300" Height="300">
            <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" x:Name="Scr">
                <Grid Background="Green" Width="100" Height="100" x:Name="Grid"/>
            </ScrollViewer>
        </Border>
    </DockPanel>
</Window>

Code behind:

using System.Windows;

namespace WpfApplication4
{
    public partial class Window3 : Window
    {
        public Window3()
        {
            InitializeComponent();
        }

        private void MoveRight(object sender, RoutedEventArgs e)
        {
            if (Grid.Margin.Right <= 0)
            {
                Grid.Margin = new Thickness(Grid.Margin.Left + 100,0,0,0);
            }
            else
            {
                Grid.Margin = new Thickness(0, 0, Grid.Margin.Right - 100, 0);
                Scr.ScrollToHorizontalOffset(Scr.HorizontalOffset - 100);
            }
        }

        private void MoveLeft(object sender, RoutedEventArgs e)
        {
            if (Grid.Margin.Left > 0)
            {
                Grid.Margin = new Thickness(Grid.Margin.Left - 100, 0, 0, 0);
            }
            else
            {
                Grid.Margin = new Thickness(0, 0, Grid.Margin.Right + 100, 0);
                Scr.ScrollToHorizontalOffset(Scr.HorizontalOffset + 100);
            }
        }
    }
}

Copy and paste my code in a File -> New -> WPF Application and see the results for yourself.




回答2:


Eventually, you might want to convert your app to WPF. Since, Winform is condemned to a small death.



来源:https://stackoverflow.com/questions/14713678/panel-in-a-panel-autoscroll

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!