2016-12-07 3 views
0

Ich habe diesen Code:WPF Setter Wert inlining

<Setter Property="WindowChrome.WindowChrome"> 
    <Setter.Value> 
     <WindowChrome CaptionHeight="{x:Static SystemParameters.CaptionHeight}"/> 
    </Setter.Value> 
</Setter> 

Die Anwendung korrekt gestartet wird, aber es ist ausführlich.

Ich habe versucht, meinen Code inline, also schrieb ich folgendes:

<Setter Property="WindowChrome.WindowChrome" 
     Value="{x:Static SystemParameters.CaptionHeight}"/> 

Aber jetzt, wenn ich die Anwendung ausführen, wird es nicht gestartet werden. Warum?

+0

Funktioniert es für Sie, wenn Sie es einfach wie die erste Option verlassen? – Tuco

+0

Ja, es läuft einwandfrei. –

+1

Da 'SystemParameters.CaptionHeight' kein Objekt vom Typ' WindowChrome' ist, kann WPF es nicht implizit für Sie konvertieren. –

Antwort

1

Die Eigenschaft ist vom Typ WindowChrome, daher werden Werte des Typs WindowChrome erwartet.

Im ersten Fall passiert es gut. Außerdem geben Sie der WindowChrome Instanz einen Wert des richtigen Typs für seine Eigenschaft CaptionHeight. Im zweiten Fall versuchen Sie, der Eigenschaft WindowChrome einen Wert eines völlig anderen Typs zuzuweisen (den Typ CaptionHeight).

Nun, wenn in Ihrer Anwendung gibt es nur eine einzige Instanz von WindowChrome ist, können Sie es als StaticResource erklären:

<App.Resources> 
    <WindowChrome x:Key="WindowChromeResource" 
       CaptionHeight="{x:Static SystemParameters.CaptionHeight}"/> 
    </WindowChrome> 
</App.Resources> 

Und es dann jedes Mal, wenn Sie anrufen müssen:

<Setter Property="WindowChrome.WindowChrome" 
     Value="{StaticResource WindowChromeResource}"/> 

Wenn Sie stattdessen eine dynamische Anzahl von verschiedenen Instanzen benötigen, ist es definitiv nicht möglich, dies inline zu tun.

Viele Entwickler hatten schon vor Ihnen viel über die WPF-Ausführlichkeit behauptet, aber das WPF-Team hat diesen Aspekt nie verbessert. Weitere Informationen finden Sie unter this und this.