@@ -312,7 +312,7 @@ private void SetViewport (Rectangle viewport)
312312 //SetSubViewNeedsDraw();
313313 }
314314
315- OnViewportChanged ( new ( IsInitialized ? Viewport : Rectangle . Empty , oldViewport ) ) ;
315+ RaiseViewportChangedEvent ( oldViewport ) ;
316316
317317 return ;
318318 }
@@ -325,6 +325,10 @@ private void SetViewport (Rectangle viewport)
325325 Size = newSize
326326 } ;
327327
328+ // Note, setting the Frame will cause ViewportChanged to be raised.
329+
330+ return ;
331+
328332 void ApplySettings ( ref Rectangle newViewport )
329333 {
330334 if ( ! ViewportSettings . HasFlag ( ViewportSettings . AllowXGreaterThanContentWidth ) )
@@ -344,6 +348,14 @@ void ApplySettings (ref Rectangle newViewport)
344348 }
345349 }
346350
351+ if ( ! ViewportSettings . HasFlag ( ViewportSettings . AllowNegativeXWhenWidthGreaterThanContentWidth ) )
352+ {
353+ if ( Viewport . Width > GetContentSize ( ) . Width )
354+ {
355+ newViewport . X = 0 ;
356+ }
357+ }
358+
347359 if ( ! ViewportSettings . HasFlag ( ViewportSettings . AllowYGreaterThanContentHeight ) )
348360 {
349361 if ( newViewport . Y >= GetContentSize ( ) . Height )
@@ -352,6 +364,14 @@ void ApplySettings (ref Rectangle newViewport)
352364 }
353365 }
354366
367+ if ( ! ViewportSettings . HasFlag ( ViewportSettings . AllowNegativeYWhenHeightGreaterThanContentHeight ) )
368+ {
369+ if ( Viewport . Height > GetContentSize ( ) . Height )
370+ {
371+ newViewport . Y = 0 ;
372+ }
373+ }
374+
355375 // IMPORTANT: Check for negative location AFTER checking for location greater than content width
356376 if ( ! ViewportSettings . HasFlag ( ViewportSettings . AllowNegativeY ) )
357377 {
@@ -363,6 +383,13 @@ void ApplySettings (ref Rectangle newViewport)
363383 }
364384 }
365385
386+ private void RaiseViewportChangedEvent ( Rectangle oldViewport )
387+ {
388+ var args = new DrawEventArgs ( IsInitialized ? Viewport : Rectangle . Empty , oldViewport ) ;
389+ OnViewportChanged ( args ) ;
390+ ViewportChanged ? . Invoke ( this , args ) ;
391+ }
392+
366393 /// <summary>
367394 /// Fired when the <see cref="Viewport"/> changes. This event is fired after the <see cref="Viewport"/> has been
368395 /// updated.
@@ -373,7 +400,7 @@ void ApplySettings (ref Rectangle newViewport)
373400 /// Called when the <see cref="Viewport"/> changes. Invokes the <see cref="ViewportChanged"/> event.
374401 /// </summary>
375402 /// <param name="e"></param>
376- protected virtual void OnViewportChanged ( DrawEventArgs e ) { ViewportChanged ? . Invoke ( this , e ) ; }
403+ protected virtual void OnViewportChanged ( DrawEventArgs e ) { }
377404
378405 /// <summary>
379406 /// Converts a <see cref="Viewport"/>-relative location and size to a screen-relative location and size.
0 commit comments