2015-09-19 3 views
-1

У меня есть что-то вроде серьезной проблемы. Я создал UserControl, который движется (как окно) в своем родителе, используя события MouseDown, MouseMove,MouseUp. [Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))] Атрибут используется, чтобы добавить элементы управления в этот UserControl в VS's Designer.Дети UserControl исчезают после перемещения

Состояние:

  • Перемещение этих UserControls работает отлично (UserControl движется, как и ожидалось ...)
  • Элементы управления могут быть добавлены в конструкторе VS и появляются как задумано в режиме исполнения [видимой, как это должно быть ]
  • Повсеместно Перемещение UserControl, Дети получают невидимы, но .Visible=true не изменяет
  • .BringToFront(); не влияет (я думал, что они могли бы быть за контейнером)

Вот класс UserControl:

[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))] 
    public partial class MovableContainer : UserControl 
    { 
     bool mdown = false; 
     Point mpos; 
     [EditorBrowsable(EditorBrowsableState.Always)] 
     [SettingsBindable(true)] 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
     public Axis Rasta { get; set; } 
     public static int DefautlRasta = 10; 
     public MovableContainer() 
     { 
      rasta = DefautlRasta; 
      InitializeComponent(); 
      this.MouseDown += ((object o, MouseEventArgs e) => 
      { 
       mdown = true; 
       mpos = this.PointToClient(MousePosition); 
      }); 
      this.MouseUp += ((object o, MouseEventArgs e) => mdown = false); 
      this.MouseMove += MovableContainer_MouseMove; 
      this.Paint += (object o, PaintEventArgs e) => 
      { 
       Console.WriteLine("BTF"); 
       this.Parent.Controls.OfType<Control>().ToList().ForEach(x => x.BringToFront()); 
       this.Controls.OfType<Control>().ToList().ForEach(x => x.BringToFront()); 
       this.Controls.OfType<Control>().ToList().ForEach(x => x.Show()); 

      }; 

      this.ParentChanged += ((object o, EventArgs e) => 
       { 
        if (this.Parent == null) 
        { 
         try { this.Parent.SizeChanged -= Parent_SizeChanged; } 
         catch { } 
        } 
        else 
        { 
         try { this.Parent.SizeChanged += Parent_SizeChanged; } 
         catch { } 
        } 
       } 
       ); 

      // this.KeyDown += ((object o, KeyEventArgs e) => { 
      ///kdown = (RastaKey == e.KeyCode); Console.WriteLine("K:"+kdown); 
      //}); 

      //this.KeyUp += ((object o, KeyEventArgs e) => kdown = false); 
     } 

     void Parent_SizeChanged(object sender, EventArgs e) 
     { 
      this.Boundis = new Rectangle(Parent.Padding.Left, Parent.Padding.Top, Parent.Size.Width - Parent.Padding.Horizontal, Parent.Size.Height - Parent.Padding.Vertical); 
      { 
       this.Location = this.Location.Add(this.PointToClient(MousePosition).Sub(mpos)).Rasta(Rasta, rasta); 
       Rectangle rct = new Rectangle(this.Location, this.Size); 
       if (this.Boundis.X > rct.X) 
       { 
        this.Location = new Point(this.Boundis.X, this.Location.Y); 
        Console.Write("R"); 
       } 
       //left 
       if (this.Boundis.Right < rct.Right) 
       { 
        this.Location = new Point(this.Boundis.Right - rct.Width, rct.Y); 
        Console.Write("L"); 
       } 
       //top 
       if (this.Boundis.Y > rct.Y) 
       { 
        this.Location = new Point(rct.X, this.Boundis.Y); 
        Console.Write("T"); 
       } 
       //bottom 
       if (this.Boundis.Bottom < rct.Bottom) 
       { 
        this.Location = new Point(rct.X, this.Boundis.Bottom - rct.Height); 
        Console.Write("B"); 

       } 
       Console.WriteLine(); 
      } 
     } 


     void MovableContainer_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (mdown) 
      { 
       this.Location = this.Location.Add(this.PointToClient(MousePosition).Sub(mpos)).Rasta(Rasta, rasta); 
       Rectangle rct = new Rectangle(this.Location, this.Size); 
       if (this.Boundis.X > rct.X) 
       { 
        this.Location = new Point(this.Boundis.X, this.Location.Y); 
        Console.Write("R"); 
       } 
       //left 
       if (this.Boundis.Right < rct.Right) 
       { 
        this.Location = new Point(this.Boundis.Right - rct.Width, rct.Y); 
        Console.Write("L"); 
       } 
       //top 
       if (this.Boundis.Y > rct.Y) 
       { 
        this.Location = new Point(rct.X, this.Boundis.Y); 
        Console.Write("T"); 
       } 
       //bottom 
       if (this.Boundis.Bottom < rct.Bottom) 
       { 
        this.Location = new Point(rct.X, this.Boundis.Bottom - rct.Height); 
        Console.Write("B"); 

       } 
       Console.WriteLine(); 

      } 

     } 
     public Rectangle Boundis { get; set; } 

    } 
    public enum Axis { X, Y, None } 

Итак, как я могу это исправить?

+1

Вы могли бы опубликовать класс UserControl? – Rariolu

ответ

1

Честно говоря, код, который вы отправили, - большой беспорядок - большинство вещей, которые вы там ставите, не имеют смысла. Из того, что я вижу, вы пытаетесь реализовать перемещаемый контейнер времени выполнения с отсечением. Простой унаследованный Panel будет делать то же самое без необходимости этих атрибутов дизайнера и т. Д. В любом случае проблема, которую вы описываете, вызвана неправильными вычислениями в вашем обработчике Parent_SizeChanged. Вот частично очищенный код, который делает то, что, как я думаю, пытается сделать без проблем:

[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))] 
public partial class MovableContainer : UserControl 
{ 
    bool mdown = false; 
    Point mpos; 
    int rasta; 
    Control parent; 

    [EditorBrowsable(EditorBrowsableState.Always)] 
    [SettingsBindable(true)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    public Axis Rasta { get; set; } 
    public static int DefautlRasta = 10; 
    public MovableContainer() 
    { 
     rasta = DefautlRasta; 
     InitializeComponent(); 
     this.MouseDown += (sender, e) => 
     { 
      mdown = true; 
      mpos = e.Location; 
     }; 
     this.MouseUp += (sender, e) => 
     { 
      mdown = false; 
     }; 
     this.MouseMove += (sender, e) => 
     { 
      if (mdown) 
       SetLocation(this.Location.Add(e.Location.Sub(mpos)).Rasta(Rasta, rasta)); 
     }; 
     EventHandler onParentSizeChanged = (sender, e) => 
     { 
      SetLocation(this.Location); 
     }; 
     this.ParentChanged += (sender, e) => 
     { 
      if (parent != null) parent.SizeChanged -= onParentSizeChanged; 
      parent = Parent; 
      if (parent != null) parent.SizeChanged += onParentSizeChanged; 
     }; 
    } 
    private void SetLocation(Point location) 
    { 
     var rect = new Rectangle(location, Size); 
     var clipRect = Parent.DisplayRectangle; 
     if (rect.Right > clipRect.Right) rect.X -= (rect.Right - clipRect.Right); 
     if (rect.X < clipRect.X) rect.X = clipRect.X; 
     if (rect.Bottom > clipRect.Bottom) rect.Y -= (rect.Bottom - clipRect.Bottom); 
     if (rect.Y < clipRect.Y) rect.Y = clipRect.Y; 
     location = rect.Location; 
     if (this.Location == location) return; 
     this.Location = location; 
    } 

} 
public enum Axis { X, Y, None } 
// You haven't provided these, so I'm guessing by the usage 
static class Utils 
{ 
    public static Point Add(this Point left, Point right) 
    { 
     return new Point(left.X + right.X, left.Y + right.Y); 
    } 
    public static Point Sub(this Point left, Point right) 
    { 
     return new Point(left.X - right.X, left.Y - right.Y); 
    } 
    public static Point Rasta(this Point pt, Axis axis, int value) 
    { 
     // Have absolutely no idea what is this about 
     return pt; 
    } 
} 
Смежные вопросы