2009-09-30 47 views
0

(這個問題的my other question on this topic這是一個有點複雜,但我真的想知道爲什麼,這並不工作,所以這裏有一個更直接的例子細化)爲什麼您可以繼承項目邊界的類而不是其附加的XAML?

什麼,我想做的事:創建一個項目中的簡單類(無XAML),在另一個項目中繼承WPF UserControl(帶有XAML)。

這裏是我的主要項目我的繼承類:

EmployeeEditor.cs:

using System.Windows.Controls; 
using System.Windows; 
using System.Windows.Media; 
using CoreApp; 

namespace TestInheritUserControl234 
{ 
    class EmployeeEditor : BaseEditor 
    { 
     public EmployeeEditor() 
     { 
      TextBlock tb = new TextBlock(); 
      tb.Text = "This was added in EmployeeEditor"; 
      tb.Foreground = new SolidColorBrush(Colors.Blue); 
      EditorContent.Children.Add(tb); 
     } 
    } 
} 

這裏是我的第二個項目我的基類,注意到它X:名稱=「EditorContent」

BaseEditor.xaml:

<UserControl x:Class="CoreApp.BaseEditor" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel x:Name="EditorContent" Margin="5"> 
     <TextBlock x:Name="TheMessage" Text="This was added in BaseEditor XAML."/> 
    </StackPanel> 
</UserControl> 

BaseEditor.xaml.cs:

using System.Windows.Controls; 
namespace CoreApp 
{ 
    public partial class BaseEditor : UserControl 
    { 
     public BaseEditor() 
     { 
      InitializeComponent(); 

      TextBlock tb = new TextBlock(); 
      tb.Text = "This was added in BaseEditor code-behind."; 
      EditorContent.Children.Add(tb); 
     } 
    } 
} 

問題是這樣的程序運行時,我得到的錯誤'EditorContent' 並不在當前的背景下存在的名稱。

但是,如果所有類都在一個項目,它運行良好。

爲什麼你可以繼承一個超出項目邊界的類,而不是它附加的XAML?

回答

1

如果我沒有弄錯,那麼默認的保護級別是內部的,這是這種情況下的問題。要修復它改變StackPanel的聲明如下:

<StackPanel x:Name="EditorContent" x:FieldModifier="public" Margin="5"> 

UPDATE:這確實帶來了另一個問題,這似乎是WPF的限制:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/4f6385ea-a176-489e-9f13-0c812195e323微軟專門防止其他程序集由於某種原因,繼承XAML定義類。從System.Windows.Application.LoadComponent()引用:

if ((info2 == null) || (info2.Assembly != component.GetType().Assembly)) 
{ 
    throw new Exception(SR.Get("UriNotMatchWithRootType", new object[] { component.GetType(), resourceLocator })); 
} 
+0

如果我這樣做,它告訴我:「組件‘TestInheritUserControl234.CustomerEditor’不具有可識別的資源」/CoreApp;組件/baseeditor.xaml「(ORIGINAL:」Die Komponente「TestInheritUserControl234.CustomerEditor」verfügtnichtübereine Ressource,die vom URI「/CoreApp;component/baseeditor.xaml」identifiziert wird。「) – 2009-09-30 15:46:18

+0

啊,這一定是爲什麼新的WPF CrystalReportsViewer不能被繼承。 – jpierson 2010-11-18 19:43:19

相關問題