2015-06-19 67 views
0

我剛剛創建了一個windows窗體應用程序來從基本窗體繼承控件,它工作正常。在WPF窗口中創建一個公共結構(主題)

在WPF中XAML是否可以繼承控件從基本形式到另一個像上面那樣?

當我在visual studio中嘗試時,出現錯誤:「'parentchild.MainWindow'不能作爲XAML文件的根,因爲它是使用XAML定義的」。

我Basewindow CS代碼:

namespace parentchild 
    { 
    public partial class BaseWindow : Window 
     { 
      public BaseWindow() 
      { 
       InitializeComponent(); 
      } 
     } 
} 

我Basewindow XAML代碼:

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:dxr="http://schemas.devexpress.com/winfx/2008/xaml/ribbon" x:Class="parentchild.BaseWindow" 
     Title="BaseWindow" Height="350" Width="525"> 
    <Grid> 
     <StatusBar HorizontalAlignment="Left" Height="35" Margin="0,285,0,0" VerticalAlignment="Top" Width="517"> 
      <Label Content="Label"/> 
      <Label Content="Label"/> 
     </StatusBar> 
    </Grid> 
</Window> 

我childwindow CS代碼:

namespace parentchild 
{ 
    public partial class childwindow : BaseWindow 
    { 
     public childwindow() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

我childwindow XAML代碼:

<mn:BaseWindow x:Class="parentchild.childwindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mn="clr-namespace:parentchild" 
      Title="childwindow" Height="300" Width="300"> 
     <Grid> 

     </Grid> 
    </mn:BaseWindow> 

我通過創建一個用戶控件並將其應用到所有窗口找到了另一個解決方案。是否正確?

或者任何人都可以爲所有Xaml窗口創建一般主題/結構。

請爲我提供解決此問題的解決方案。

+0

這可能有幫助 - http://stackoverflow.com/a/7508090/442444 – CarbineCoder

+0

[MyUserControl不可能是XAML文件的根,因爲它是使用XAML定義的](http://stackoverflow.com/問題/ 10873008 /的MyUserControl-不能待的根對的一-XAML的文件因爲-IT-被定義-使用-XAM) – Sinatr

回答

1

您不能從已在xaml中定義的類繼承。我可能會去創建一個UserControl,並將其用作任何想要具有狀態欄的窗口中的「基本容器」。如果你是在做一個基本窗口的意圖,你可以嘗試這樣的事:

定義基本窗口只代碼:

public class MyWindowBase : Window 
    { 
     private ContentControl contentControl; 

     public MyWindowBase() 
     { 
      this.CreateContent(); 
     } 

     public Object BaseContent 
     { 
      get { return this.contentControl.Content; } 
      set { this.contentControl.Content = value; } 
     } 

     private void CreateContent() 
     { 
      var grid = new Grid(); 
      var row1 = new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) }; 
      var row2 = new RowDefinition() { Height = GridLength.Auto }; 
      grid.RowDefinitions.Add(row1); 
      grid.RowDefinitions.Add(row2); 

      var statusBar = new StatusBar() { Height = 35, Background = Brushes.Blue }; // Initialize the status bar how you want. 
      Grid.SetRow(statusBar, 1); 

      this.contentControl = new ContentControl(); 

      grid.Children.Add(this.contentControl); 
      grid.Children.Add(statusBar); 

      base.Content = grid; 
     } 
    } 

使用在XAML基本窗口是這樣的:

<WpfApplication7:MyWindowBase xmlns:WpfApplication7="clr-namespace:WpfApplication7" x:Class="WpfApplication7.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="500"> 
    <WpfApplication7:MyWindowBase.BaseContent> 
     <Button> 
      Something 
     </Button> 
    </WpfApplication7:MyWindowBase.BaseContent>  
</WpfApplication7:MyWindowBase> 

當然,基類有改進的餘地,比如使BaseContent成爲一個依賴屬性,但我認爲它證明了主要思想。

0

它看起來像你基本上試圖創建一個自定義控件,擴展Window。在WPF中創建自定義控件是一個複雜的主題,因爲在決定如何實現時需要考慮很多因素。看看這一篇文章,談到這一點:

Control Authoring Overview

最有可能的,你實際上並不想自定義控制,而是一個自定義ControlTemplate(在XAML着),重新定義你希望你的窗口看。您可以在Style中定義該模板,並將該樣式應用於您想要的任何Window。在答案中嘗試解釋很多,所以您應該瞭解控件模板的工作原理以及它們的用途。

如果您決定需要將新屬性添加到自定義窗口,那麼您將需要創建一個新類,該類延伸Window並將這些屬性添加爲dependency properties(現在您擁有自定義控件)。然後,您可以在自定義ControlTemplate中使用這些屬性來執行您想要的任何操作。

在WPF中工作並不像在Windows窗體中工作。如果您嘗試將您在Windows窗體中學到的技巧和實踐應用到WPF應用程序,那麼您會導致很多麻煩。幾年前我做了這個轉換,我的建議是根據你從Windows Forms中得知的內容,不做任何關於WPF的假設。他們是完全不同的系統,具有不同的做事方式。