Ich möchte Bereich innerhalb eines Containers zeichnen. Hierfür habe ich über die Verwendung von benutzerdefinierten Steuerelementen nachgedacht.WPF ziehen Grenze in Container
Mein Problem ist, dass Canvas nicht den gesamten Platz beansprucht, den es bekommt. Wie erzwingen Sie es verwenden Sie alle verfügbaren Speicherplatz?
Was ich habe, ist getan von Canvas geerbt und im Inneren Randelement erstellt:
public class DrawableCanvas : Canvas
{
private Border border;
static DrawableCanvas()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(DrawableCanvas), new FrameworkPropertyMetadata(typeof(DrawableCanvas)));
}
public DrawableCanvas()
{
this.border = new Border();
border.Background = new SolidColorBrush(Colors.Blue);
border.BorderThickness = new Thickness(1);
border.Width = 0;
border.Visibility = Visibility.Hidden;
border.Opacity = 0.3;
this.Children.Add(border);
this.MouseLeftButtonDown += DrawableCanvas_MouseLeftButtonDown;
this.MouseLeftButtonUp += DrawableCanvas_MouseLeftButtonUp;
this.MouseMove += DrawableCanvas_MouseMove;
}
private void DrawableCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
Debug.WriteLine("Left mouse up");
// release mouse
Mouse.Capture(null);
border.Width = 0;
border.Height = 100;
startPosition = 0;
}
double startPosition = 0;
private void DrawableCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Debug.WriteLine("Left mouse down");
border.Visibility = Visibility.Visible;
// capture mouse
Mouse.Capture(this);
var point = e.GetPosition(this);
startPosition = point.X;
SetLeft(border, point.X);
}
private void DrawableCanvas_MouseMove(object sender, MouseEventArgs e)
{
if(this.IsMouseCaptured)
{
var point = e.GetPosition(this);
Debug.WriteLine("Mouse move");
// set the position to far left
SetLeft(border, Math.Min(startPosition, point.X));
// width is the difference between two points
border.Width = Math.Abs(startPosition - point.X);
Debug.WriteLine(Math.Min(startPosition, point.X));
Debug.WriteLine(border.Width);
}
}
}
Und für Ansicht:
<DockPanel>
<local:DrawableCanvas>
<Rectangle Height="500" Width="500" Fill="Transparent" />
</local:DrawableCanvas>
</DockPanel>
Ich möchte etwas wie folgt aus:
Sind Sie sicher, dass sich das DockPanel auf den gesamten Platz erstreckt? Stellen Sie mehr XAML zur Verfügung. –
Ich habe Ihren Code mit dem DockPanel in einem Grid in einem Fenster versucht. Die einzige Änderung, die ich gemacht habe, war ''. Das 'DockPanel' füllt das' Grid' und das 'Grid' füllt das Fenster. Bitte erklären Sie, warum Sie denken, dass Sie ein Problem haben. Sind Sie verwirrt, weil die 'Border'-Höhe immer 100 ist? Das liegt daran, dass Sie es darauf einstellen und es niemals ändern. –
Versuchen Sie, das Rechteckelement zu entfernen. Mausereignisse werden in diesem Fall nicht ausgelöst. Ich habe gerade herausgefunden, wenn ich Hintergrund der Leinwand zu transparent, dies funktioniert. Können Sie mir erklären, warum ich dann Ihre Antwort akzeptiere :) –