2010-12-31 11 views
4

Ich habe Probleme beim Erstellen eines benutzerdefinierten Fenstertyps, der von System.Windows.Window abgeleitet ist. Es scheint zwei Probleme zu geben, die auftreten. Zum einen gibt es einen Fehler bei der Kompilierung unter AngabeWPF: Vererbt von Fenster

Kann nicht das statische Element ‚Content‘ von der Art ‚Control‘ finden

Das in Referenz auf das Contentelement in der Control für die benutzerdefiniertes Fenster (siehe Codebeispiel für BaseWindowResource.xaml unten). Ich weiß nicht, warum das passiert, da BaseWindow von Window abstammt und daher eine Content-Eigenschaft haben muss ...

Das zweite Problem ist die Tatsache, dass ich anscheinend nicht das ContentRendered-Ereignis von BaseWindow bekommen kann fire, wenn Window1, das von BaseWindow abgeleitet ist, das Rendern beendet hat ... Ich muss das ContentRendered-Ereignis in BaseWindow behandeln, da der Handler viel Code enthält, der sonst in jede abgeleitete Klasse kopiert werden müsste ...

Auf jeden Fall, hier ist der Code. Jede Hilfe wird sehr geschätzt!

Cheers,

Andrew

App.xaml:

<Application x:Class="WpfApplication4.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="Window1.xaml"> 
    <Application.Resources> 
     <ResourceDictionary Source="/BaseWindowResource.xaml" /> 
    </Application.Resources> 
</Application> 

BaseWindowResource.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:WpfApplication4"> 
    <Style TargetType="{x:Type local:BaseWindow}" x:Key="BaseWindowStyleKey"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate> 
        <Grid> 
         <Rectangle Margin="20" Fill="Green" x:Name="MyRect" /> 
         <ContentPresenter Margin="30" x:Name="MyContentPresenter" 
              Content="{TemplateBinding Content}" 
              ContentTemplate="{TemplateBinding ContentTemplate}" /> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

BaseWindow.cs:

public class BaseWindow : Window 
    { 
     public BaseWindow() 
     { 
      Style = FindResource("BaseWindowStyleKey") as Style; 

      ContentRendered += new EventHandler(BaseWindow_ContentRendered); 
     } 

     void BaseWindow_ContentRendered(object sender, EventArgs e) 
     { 
      ContentPresenter contentPresenter = Template.FindName("MyContentPresenter", this) as ContentPresenter; 

      MessageBox.Show(String.Format("The dimensions for the content presenter are {0} by {1}", 
       contentPresenter.ActualWidth, 
       contentPresenter.ActualHeight)); 
     } 
    } 

Window1.xaml:

<local:BaseWindow x:Class="WpfApplication4.Window1" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:WpfApplication4" 
        Title="Window1" Height="300" Width="300"> 
</local:BaseWindow> 

und schließlich Window1.xaml.cs:

public partial class Window1 : BaseWindow 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 
} 

Nun, das ist der gesamte Code. Es isoliert die Probleme ziemlich genau.

Cheers,

Andrew

Antwort

8

Versuchen Sie, die Art wie folgt festgelegt wird:

Content="{TemplateBinding Window.Content}" 

denke ich, das zweite Problem auf die erste bezieht. Geben Sie hier einen Kommentar ein, wenn die zweite Lösung nicht durch diese Lösung gelöst wird.

+0

Wow lösen, Sie qualifizieren den Eigenschaftsnamen richtig waren. Das ContentRendered-Ereignis wird jedoch immer noch nicht ausgelöst ... – Andrew

+0

Hat es Inhalt? MSDN gibt folgend an: 'Wenn das Fenster keinen Inhalt enthält, wird dieses Ereignis nicht ausgelöst. http://msdn.microsoft.com/en-us/library/system.windows.window.contentrendered.aspx – decyclone

+0

Dank decyclone, das das Problem behoben. Gutes Auge.Ich weiß, dass ich diese Seite gelesen habe, aber ich denke, ich war nicht vorsichtig genug. Vielen Dank! – Andrew

1

Zugabe von Target sollte das Problem

exemple

<ControlTemplate TargetType="Window">