Floating Window in WPF (mit XAML)

kaetzchen1976

Grünschnabel
Hallo zusammen,

ich suche schon nach einer Weile nach einer Idee, wie ich Floating Windows in WPF erstellen kann. Gefunden habe ich bis jetzt als Beispiel:

http://assergs.com/wpf/

Allerdings bekomme ich nicht heraus, wie man so etwas erstellt. Den Entwickler habe ich schon angemailt, aber bisher keine Antwort erhalten.

Fenster im Fenster sind bei WPF nicht erlaubt. Da stolpere ich schon bei MDI drüber (wo ich auch noch immer eine nette Lösung suche).

Es gibt bei WPF zwar die Möglichkeit, die Windows Forms einzubinden, aber dies sollte nur eine Notlösung sein und bringt mich hier nicht wirklich weiter.

Hat jemand einen Tip, wie ich das Ganze anfangen muss?

Grüsse
Micha
 
Verschiebbare Panels? Du kannst ja ein eigenes Control entwickeln, abgeleitet von einem Panel, welches in deinem Window beliebig verschiebbar ist. Wär das keine Idee?
 
Danke dir!!

Dein Tip hat mich zumindest mal ein UserControl basteln lassen, was ein bisschen das tut, was ich mir vorgestellt hatte. Und ich bin davon abgekommen, das unbedingt mit den Forms in WPF zu verwirklichen.

Eigentlich hatte ich mir das als "Ableitung" von den Forms einfacher vorgestellt, weil ich dann vielleicht den Code von den Forms-Funktionen hätte übernehmen können. Das Problem bei WPF ist für mich nämlich irgendwie, dass es oft bekannte Standardabläufe einfach nicht mehr gibt. Alleine an der Maus-Position bin ich jetzt schon verzweifelt...

Immerhin kann ich jetzt was verschieben, wie ich das von den Forms her kenne.

So sieht jetzt das Control aus, was ich in ein Canvas gesteckt habe, weil man dort die Position angeben kann:

Code:
<UserControlName ="myControl"Content="MoveMe"
Canvas.Top="10"Canvas.Left="20"
Background="DarkRed"Opacity="0.7"
FontWeight="Bold"FontSize="14"
Height="80"Width="200"AllowDrop="True"
MouseDown="control_MouseDown"
MouseMove="control_MouseMove"
MouseUp="control_MouseUp"/>

Bewegt wird das ganze dann so:

Code:
bool isDragging;
Point controlPoint, mousePoint, newMousePoint;
 
// save the points where mouse and control are
privatevoid control_MouseDown(object sender, MouseEventArgs e)
{
isDragging = true;
controlPoint =
  newPoint(Canvas.GetLeft(this.myControl), Canvas.GetTop(this.myControl));
mousePoint =
  newPoint(Mouse.GetPosition(this).X, Mouse.GetPosition(this).Y);
}
 
// move to the actual point
privatevoid control_MouseMove(object sender, MouseEventArgs e)
{
if (isDragging == true)
{
  newMousePoint = 
    newPoint(Mouse.GetPosition(this).X, Mouse.GetPosition(this).Y);
  Canvas.SetLeft(this.myControl, (controlPoint.X + newMousePoint.X -
    mousePoint.X));
  Canvas.SetTop(this.myControl, (controlPoint.Y + newMousePoint.Y -   
    mousePoint.Y));
}
}
 
privatevoid control_MouseUp(object sender, MouseEventArgs e)
{
isDragging = false;
}

Das ganze muss man jetzt natürlich noch "hübsch" machen und ein bisschen wie ein Fenster aussehen lassen :)

Danach widme ich mich meinem MDI - vielleicht kann ich da ein WPF-Panel nehmen. Das hat nämlich die Parent-Child-Möglichkeiten, wo ich eben durch Zufall drüber gestolpert bin ;-)
 
Control "window-like"

Mit dem HeaderedContentControl kann man dann auch noch was windows-ähnliches rumfliegen lassen:

Code:
...
<DataTemplatex:Key="header">
 <TextBlockText="{Binding}"Background="DarkRed"
   Foreground="White"FontSize="16"FontWeight="Bold"
   Width="150"Height="20"TextWrapping="Wrap"/>
</DataTemplate>
 
<DataTemplatex:Key="content">
 <TextBlockText="{Binding}"Background="Silver"Opacity="0.7"
   Foreground="DarkRed"FontSize="12"FontWeight="Normal"
   Width="150"Height="60"TextWrapping="Wrap"/>
</DataTemplate>
...
 
<HeaderedContentControlName="myControl"Header="Window 1"
 HeaderTemplate="{StaticResource header}"
 Canvas.Top="10"Canvas.Left="20"
 AllowDrop="True"
 MouseDown="control_MouseDown"
 MouseMove="control_MouseMove"
 MouseUp="control_MouseUp">
   <ContentControlName="myContent"Content="This is the content of window 1."
     ContentTemplate="{StaticResource content}"/>
</HeaderedContentControl>
 

Neue Beiträge

Zurück