<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>C and it&#039;s sharp &#187; Add new tag</title>
	<atom:link href="http://berndhengelein.de/tag/add-new-tag/feed/" rel="self" type="application/rss+xml" />
	<link>http://berndhengelein.de</link>
	<description>berndhengelein.de</description>
	<lastBuildDate>Sat, 30 Oct 2010 20:08:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Rahmenlose Fenster mit WPF</title>
		<link>http://berndhengelein.de/2009/04/rahmenlose-fenster-mit-wpf/</link>
		<comments>http://berndhengelein.de/2009/04/rahmenlose-fenster-mit-wpf/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 18:44:37 +0000</pubDate>
		<dc:creator>Bernd</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[Add new tag]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://berndhengelein.de/?p=222</guid>
		<description><![CDATA[ 
Achtung, das folgende Beispiel bringt wahrscheinlich keinen Nutzen für den täglichen Umgang mit WPF!
EGAL! Manchmal muss man eben auch spielen  . Rahmenlose Fenster sind einfach cool. Wenn dann auch noch ein guter Designer mit im Spiel ist, sieht das Ganze auch besser aus als bei meinem Versuch.
Ok, Design beiseite. Was ist zu tun [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://berndhengelein.de/wp-content/uploads/2009/04/nonrectwindow-new1.png"><img title="NonRectWindow" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 15px 15px 0px; border-right-width: 0px" height="215" alt="NonRectWindow" src="http://berndhengelein.de/wp-content/uploads/2009/04/nonrectwindow-new-thumb1.png" width="215" align="left" border="0" /></a> </p>
<p>Achtung, das folgende Beispiel bringt wahrscheinlich keinen Nutzen für den täglichen Umgang mit WPF!</p>
<p>EGAL! Manchmal muss man eben auch spielen <img src='http://berndhengelein.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Rahmenlose Fenster sind einfach cool. Wenn dann auch noch ein guter Designer mit im Spiel ist, sieht das Ganze auch besser aus als bei meinem Versuch.</p>
<p>Ok, Design beiseite. Was ist zu tun um eine Anwendung mit einem rahmenlosen Fenster zu erstellen?</p>
<p> Der erste Schritt besteht darin, an dem Fenster der Applikation drei Eigenschaften entsprechend zu setzen:</p>
<ul>
<li><em>AllowsTransparency</em> auf <em>true</em> </li>
<li><em>WindowStyle</em> auf <em>None – </em>in Verbindung mit <em>AllowsTransparency=”True”</em> wird erreicht, dass der Fensterrahmen und die Titelzeile verschwinden </li>
<li><em>Background</em> auf <em>Transparent</em>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9cb4b206-4d7f-4be6-b1d4-73d4b8cbf196" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml:nogutter:nocontrols">&lt;Window x:Class="NonRectShapedWindowWPF.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="215"
    Height="215"
    AllowsTransparency="True"
    WindowStyle="None"
    Background="Transparent"&gt;
...</pre>
</div>
<p>In meinem Beispiel habe ich mich dazu entschieden das UI aus zwei Kreisen zusammenzusetzen. Der grosse Kreis dient als “Hauptrahmen” der Anwendung und der kleine Kreis enthält einen “Close” Button. </li>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c472a9b8-8b38-4010-916d-ea67003c181f" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml:nogutter:nocontrols">...
&lt;Grid Height="200" Width="200"&gt;
    &lt;Ellipse Fill="Red" Stroke="DarkRed"
             MouseLeftButtonDown="OnCircleMouseLeftButtonDown"&gt;
        &lt;Ellipse.BitmapEffect&gt;
            &lt;OuterGlowBitmapEffect GlowSize="8" GlowColor="OrangeRed" /&gt;
        &lt;/Ellipse.BitmapEffect&gt;
    &lt;/Ellipse&gt;

    &lt;Canvas...&gt;

    &lt;Button Margin="150 -150 0 0"
            Template="{StaticResource closeButton}"
            FontFamily="Webdings"
            FontWeight="Bold"
            FontSize="10"
            Content="r"
            Click="OnCloseButtonClick"
            ToolTip="Close"&gt;
    &lt;/Button&gt;
&lt;/Grid&gt;
...</pre>
</div>
</ul>
<p>Der eigentliche Inhalt der Anwendung versteckt sich in dem zusammengeklappten &lt;<em><a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.canvas.aspx" target="_blank">Canvas</a></em>&gt; Element. Die Details dazu gibt es weiter unten.</p>
<p>Wie in dem XAML Code zu sehen ist, wird der “Close” Button über die Margin Eigenschaft an der gewünschten Stelle positioniert. Um dem Button ein rundes Aussehen zu verpassen, habe ich ein <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.controltemplate.aspx" target="_blank">ControlTemplate</a> erstellt.</p>
</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2bb5d9da-bac1-4cac-b04e-d49ef7136588" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml:nogutter:nocontrols">...
&lt;ControlTemplate x:Key="closeButton" TargetType="{x:Type Button}"&gt;
    &lt;Grid&gt;
        &lt;Ellipse Fill="Red" Stroke="DarkRed"
                 Width="25" Height="25"/&gt;

        &lt;Label Content="{TemplateBinding Content}"
               Foreground="Black"
               HorizontalAlignment="Center" VerticalAlignment="Center"/&gt;
    &lt;/Grid&gt;
&lt;/ControlTemplate&gt;
...</pre>
</div>
<p>Um dem Anwender ein Verschieben des Fensters zu ermöglichen, fügt man einen Eventhandler für das <em>MouseLeftButtonDown</em> Event hinzu. Und zwar an dem Element, mit dem das Fenster verschoben werden soll. Das könnte z.B. eine eigene Titelleiste sein, oder wie bei mir irgendein anderes, sichtbares Element. Der Code in dem Eventhandler ist sehr einfach:</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:95cfd2e8-2bed-45c4-8958-0c2c7e1179b9" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">private void OnCircleMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    DragMove();
}</pre>
</div>
<p>Ein weiterer Eventhandler wird für das Click Event unseres “Close” Buttons benötigt um das Fenster zu schliessen:</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e8c6b9ac-64b3-49a2-ba69-416377674000" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">private void OnCloseButtonClick(object sender, RoutedEventArgs e)
{
    Close();
}</pre>
</div>
<p>Damit sind die wichtigsten Schritte gemacht, um ein rahmenloses Fenster mit WPF zu erstellen. Es kann vom Anwender verschoben und geschlossen werden. Um ein bisschen Action in das Beispiel zu bringen, gibt es noch eine kleine Animation, die Text durch das Fenster scrollen lässt. Der Code dazu sieht so aus:</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3640bf0c-f00e-4f67-bdde-99a3fb1d7f4e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml:nogutter:nocontrols">...
&lt;Canvas Height="100" Width="120" ClipToBounds="True"&gt;
    &lt;TextBlock x:Name="_text"
               Height="100" Width="120"
               VerticalAlignment="Center" HorizontalAlignment="Center"
               TextWrapping="Wrap"
               FontFamily="Tahoma" FontSize="12"&gt;
            &lt;TextBlock.Text&gt;
                Diese Anwendung ist völlig sinnlos. Zu nichts zu gebrauchen. Und doch hat es viel Spass
                gemacht sie zu erstellen.
            &lt;/TextBlock.Text&gt;
            &lt;TextBlock.Triggers&gt;
                &lt;EventTrigger RoutedEvent="TextBlock.Loaded" &gt;
                  &lt;BeginStoryboard&gt;
                    &lt;Storyboard&gt;
                      &lt;DoubleAnimation
                        Storyboard.TargetName="_text"
                        Storyboard.TargetProperty="(Canvas.Top)"
                        Duration="0:0:4"
                        From="110" To="-80"
                        RepeatBehavior="Forever"/&gt;
                    &lt;/Storyboard&gt;
                    &lt;/BeginStoryboard&gt;
                &lt;/EventTrigger&gt;
            &lt;/TextBlock.Triggers&gt;
    &lt;/TextBlock&gt;
&lt;/Canvas&gt;
...</pre>
</div>
<p>Das komplette Beispiel kann hier heruntergeladen werden:</p>
<p><iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-a575d63718548aa9.skydrive.live.com/embedrowdetail.aspx/Public/Examples%20from%20blog/NonRectShapedWindowWPF.zip" frameborder="0" scrolling="no"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://berndhengelein.de/2009/04/rahmenlose-fenster-mit-wpf/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

