2013-10-10 49 views
2

我有一個小窗口,當我嘗試加載應用程序啓動時。這裏是(鬆散的)XAML:嘗試使用標記擴展時出錯

<ctrl:MainWindow 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ctrl="clr-namespace:Controls;assembly=Controls"> 
<Grid> 
    <ctrl:ConnectionStatusIndicator/> 
    <TextBlock Grid.Row="2" Text="{Resx ResxName=MyApp.MainDialog, Key=MyLabel}"/> 
</Grid> 
</ctrl:MainWindow> 

請注意稱爲ConnectionStatusIndicator的自定義控件。它的代碼是:

using System.Windows; 
using System.Windows.Controls; 

namespace Controls 
{ 
    public class ConnectionStatusIndicator : Control 
    { 
     public ConnectionStatusIndicator() 
     { 
     } 

     static ConnectionStatusIndicator() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(ConnectionStatusIndicator), 
                new FrameworkPropertyMetadata(typeof(ConnectionStatusIndicator))); 
      IsConnectedProperty = DependencyProperty.Register("IsConnected", typeof(bool), typeof(ConnectionStatusIndicator), new FrameworkPropertyMetadata(false)); 
     } 

     public bool IsConnected 
     { 
      set { SetValue(IsConnectedProperty, value); } 
      get { return (bool)GetValue(IsConnectedProperty); } 
     } 

     private static DependencyProperty IsConnectedProperty; 
    } 
} 

現在,這裏是它變得奇怪(對我來說,至少)。使用上面顯示的XAML,我的應用程序將構建並運行得很好。但是,如果我刪除以下行:

<ctrl:ConnectionStatusIndicator/> 

或事件將其移動一行下來,我得到以下錯誤:

Additional information: 'Cannot create unknown type '{ http://schemas.microsoft.com/winfx/2006/xaml/presentation }Resx'.' Line number '13' and line position '33'.

什麼是真奇怪,我是說,如果我更換ConnectionStatusIndicator與來自同一個程序集的另一個自定義控件一起,我得到錯誤。另一個自定義控件非常相似,但有更多的屬性。

任何人都可以解釋這裏發生了什麼?

+0

不應該命名空間爲:CNC.UI.Controls在XAML? – CSharpie

+0

這是什麼?{ResxName = MyApp.MainDialog,Key = MyLabel}? –

+0

之前我曾經被咬過的一件事是,如果依賴項屬性不公開,設計師喜歡採取行動。嘗試將「IsConnectedProperty」公開標記,看看它是否有幫助。 – Psytronic

回答

1

Resx標記擴展屬於Infralution.Localization.Wpf命名空間,但也做了一個有點hackish,並試圖將其自身註冊爲http://schemas.microsoft.com/winfx/2006/xaml/presentation XML命名空間,允許開發人員使用它作爲{Resx ...}而不必聲明命名空間的XAML和使用擴展名前綴爲{resxNs:Resx ...}

我相信如果你清理你的解決方案,並可能刪除你的* .sou文件,項目將按預期構建,但解決這個問題的一個可靠方法是爲Infralution.Localization.Wpf添加一個xmlns聲明,並使用擴展名的xmlns前綴:

<ctrl:MainWindow 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ctrl="clr-namespace:Controls;assembly=Controls" 
    xmlns:loc="clr-namespace:Infralution.Localization.Wpf;assembly=Infralution.Localization.Wpf"> 
    <Grid> 
     <ctrl:ConnectionStatusIndicator/> 
     <TextBlock Grid.Row="2" Text="{loc:Resx ResxName=MyApp.MainDialog, Key=MyLabel}"/> 
    </Grid> 
</ctrl:MainWindow> 

此外,對於有興趣的人,在 「黑客」 是在本地化庫這些行:

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Infralution.Localization.Wpf")] 
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2007/xaml/presentation", "Infralution.Localization.Wpf")] 
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2008/xaml/presentation", "Infralution.Localization.Wpf")] 
+0

謝謝!我嘗試添加名稱空間,但從未使用它。謝謝! – JAB

+0

@Adi Lester,如何在應用程序的其他(除Shell/MainWindow)xaml文件中使用此(Resx)。即使所提供的例子是MainWindow,我也找不到語法。在另一個項目下可能出現的其他申請意見如何? – kamlendra

+1

@kamlendra我不是一個關於擴展的權威,也沒有與它合作過很長一段時間,但我認爲它的用法對於其他視圖/用戶控件沒有任何不同。 –

相關問題