2013-01-17 50 views
3

我在WPF中有一個成本窗口,我想用它作爲其他窗口的基本窗口。
當我嘗試繼承它,我寫在XAML:繼承自WPF中的自定義窗口

<my:MyWindow x:Class="NewWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:my="clr-namespace:MyNamesapce;assembly=MyAssembly" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 

在的.cs代碼中,我寫道:

namespace SomeOtherNamespace 
{ 
    public partial class NewWindow: MyWindow 
    { 
     internal NewWindow(Control ctrl) : base(ctrl) 
     { 
      InitializeComponent(); 
      this.ResizeMode = System.Windows.ResizeMode.NoResize; 
     } 
    } 
} 

但後來我得到的錯誤:

cannot be the root of a XAML file because it was defined using XAML.

我在做什麼錯,我該如何解決?

+0

.cs類中的內容是什麼? – ZSH

+2

如果要在XAML中派生控件,則無法在XAML中定義基礎控件。 –

+0

你想從主窗口繼承什麼?您可以使用基礎樣式來完成此操作。 –

回答

7

如果你想實現的是設置ResizeModeNoResize在每一個窗口中你可以使用這樣的風格:

<Style TargetType="Window" x:Key="windowStyle"> 
    <Setter Property="ResizeMode" Value="NoResize" /> 
</Style> 

將這個風格在ResourceDictionary中,並使其成爲窗口樣式:

Style="{StaticResource windowStyle}" 

但是如果你想走得更遠,你將不得不作出一個新的類從窗口繼承

public class MyWindow : Window 
{ 
    public MyWindow() 
    { 
     this.ResizeMode = ResizeMode.NoResize; 
    } 
} 

現在你能實例化一個新的MyWindow

<mn:MyWindow x:Class="Project.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mn="clr-namespace:MyControls" 
     Height="300" Width="300"> 
</mn:MyWindow> 

要知道,這將是「代碼背後」這個新窗口的類需要從你的新MyWindow類,如下繼承:

namespace Project 
{ 
    public partial class Window1 : MyControls.MyWindow 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 
    } 
} 
+0

你能說你的xaml代碼裏有什麼「mn」嗎? Esi

+0

它是對「MyControls」命名空間的引用。正如你在代碼'xmlns:mn =「clr-namespace:MyControls」'中看到的那樣。 –

+0

我明白了,謝謝 – Esi