簡體   English   中英

"XAML:命名空間奇怪行為 Visual Studio"

[英]XAML: namespace strange behaviour Visual Studio

我當前的 WPF 項目之一有問題。 該項目用於編譯(和運行)就好了。 然后,出於許可問題,我們決定從庫中刪除擴展 WPF 工具包。 我使用了NumericUpDown<\/code> s( ShortUpDown<\/code> ,...不是已棄用的),所以我決定自己編寫。

我已經編寫了一個UserControl<\/code>並且對此感到非常滿意,但是當我將 UpDowns 與我稱為MySpinner<\/code>的控件交換后,它就停止了工作:

  • 設計器不再顯示我的窗口並顯示錯誤消息: “設計視圖無法正確顯示,因為尚未構建一些自定義元素。”<\/em> .

  • 我的項目不再構建,有很多錯誤消息表明我所有使用的類都不位於它們的命名空間中(除MySpinner<\/strong> MySpinner<\/code>的每個類)或(來自代碼后面的錯誤)表明我的命名控件(類型為MySpinner<\/code> )不存在於當前上下文 - 可能是由於 XAML 未編譯。

    我項目中的所有內容都在命名空間DeviceSimulator<\/code>中,我已將其“導入”為con<\/code> : xmlns:con="clr-namespace:DeviceSimulator"<\/code>在我的Window<\/code>開頭(之前運行良好)。

    如果我鍵入<con:<\/code> IntelliSense 甚至可以正確地向我顯示命名空間中的每個類作為可能的完成。

    我知道已經有很多關於看似相似主題的問題,但不同之處在於,在我的情況下,該項目沒有<\/strong>構建。 盡管有錯誤,但項目構建的問題是我遇到過幾次的問題,但這里不是這種情況。

    我嘗試了針對其他問題提出的解決方案,例如重新啟動、重建、清理或將編譯目標從Any CPU<\/code>更改為x86<\/code>並返回,但沒有任何效果(構建和重建不起作用,因為解決方案無法編譯)。 我正在使用的所有內容都駐留在我的項目文件夾中(當然除了來自schemas.microsoft.com...<\/code>的默認命名空間定義),沒有額外的庫或我包含的其他庫,並且我不在網絡或服務器上工作任何一種。

    這個問題出現在我使用 Express 版本的 Visual Studio 2013 和 2012 中。

由於用戶已經找到了解決他們問題的方法,因此這並不意味着要提供答案,而只是與該情況有關的一些信息。

當您在解決方案中發現幾十個甚至數百個以前沒有的錯誤時,您可以放心,它們主要是“紅色鯡魚”或錯誤/臨時錯誤。 發生這種情況是因為最近更改了某些內容並在項目中引起了一個或幾個錯誤。

通常,其他項目引用的是現在已損壞的項目,因此任何引用已損壞項目中的類的類現在也都顯示一個或多個錯誤……這些是錯誤的或更准確的說是臨時錯誤,當實際發生時這些錯誤會消失。錯誤已修復,該項目將重新生成。

當一個類中的錯誤會導致其他引用損壞的類的類顯示錯誤,表明某個類顯然不存在時,這也可能在單個項目應用程序中發生。 這有點像更改解決方案平台或解決方案配置時的情況,只是在這種情況下,Visual Studio會意識到這些錯誤本身並不是實際錯誤。

那么我們如何解決這些問題呢? 通常,這很容易,因為通常這是導致實際錯誤的最后編輯內容。 即使不是這種情況,您也可以在Visual Studio中Error List的“ Project列,通常出現最多的項目名稱就是出現錯誤的項目名稱。

此外,您可以忽略很多錯誤,例如“在項目/命名空間Y中找不到X類”,因為您知道它們確實可以。 跟蹤實際錯誤是最棘手的部分。

可以對多項目應用程序有所幫​​助的另一個技巧是,使用Build > Build XXX (ProjectName)選項而不是Build Solution選項來首先構建損壞的項目。 您首先需要在Solution Explorer選擇相關項目。 有時,只需要按特定順序構建項目,但是使用“ Build Solution選項具有其自己的構建順序,該順序可能會有所不同。

問題作者最初在設計器中遇到的錯誤聽起來像他們實際需要做的一切就是先構建包含CustomControls的項目,然后在該項目具有dll文件時構建其余項目。

我希望這可以幫助其他面臨數百個錯誤的用戶。

正如古斯多(Gusdor)在評論中所建議的那樣,該問題已通過從項目中刪除每條虛線並重新構建而得以解決。

因此,似乎問題出在項目中某種形式的循環依賴項(UserControl> XAML> UserControl),該循環依賴項是通過打破依賴關系然后構建一部分來固定的,以便以后可以重新插入依賴項並可以將項目作為一個整體進行編譯。

我發布了這個答案,因為Gusdor似乎沒有發布他的答案,並且我不希望這個問題看起來沒有答案。

為了在XAML設計器中查看XAML代碼,頁面絕對必須是正確的標記。 未編譯的隱藏代碼應被注釋掉,以便您可以構建項目。

當我們嘗試將一個名為“ BaseView”的類和一個XAML頁面從其舊項目遷移到我們的新項目時,在項目中遇到了類似的問題。 這些項目具有不同的名稱空間。 我們要移動的XAML頁面在其代碼背后(而不是Page繼承了BaseView類。

  1. 我們在解決方案資源管理器中進行了“添加現有項目”,然后將類和頁面(將其代碼隱藏文件)從舊項目拖放到了新項目中,全部從Visual Studio中新項目的解決方案資源管理器。 注意:我們后來發現應該在新項目中創建一個新文件夾,而不是將包含代碼的文件夾從新項目中拖動到舊項目中,而只是復制舊代碼並將其粘貼到新文件夾中)(詳細信息有關如何達到這一點的信息: https : //msdn.microsoft.com/zh-cn/library/879x19d1(v=vs.90 ) .aspx
  2. 我們更新了名稱空間,並using了引用BaseView類文件和XAML頁面代碼后的舊名稱空間的語句。
  3. 我們更新了XAML頁面指令中的命名空間,該指令從類文件中繼承: <v:BaseView x:Class="OurNamespace.View.PageClassName" ...向下直到vmlns:v="clr-namespace:OurNamespace.View"...

即使在執行“構建解決方案”之后,我們仍然發現它出現了可怕的“ 設計視圖無法正確顯示,因為尚未構建某些自定義元素 ”的錯誤。 當我們將OurNamespace懸停在XAML標記中的<v:BaseView時,即使BaseView的命名空間正確更新,我們也遇到了錯誤,即BaseView並不駐留在OurNamespace

要解決該錯誤,請在將類文件移至根(XAML頁面所在的文件夾之外),執行“構建解決方案”,然后將其移回該文件夾,執行另一個“構建解決方案”之間,然后單擊兩次。在XAML設計器底部,水平滾動條左側的一個名為“ 啟用項目代碼 ”的按鈕,我們終於得到了它來識別該類,並最終使XAML設計器栩栩如生-無論是按鈕還是第二個版本,不確定是什么解決了-如果我不得不花錢的話,可能是按鈕。

后來我們發現,如果從另一個工作站啟動該項目,仍然會遇到問題,如果嘗試打開XAML頁面,它將在“輸出”選項卡中給出此錯誤:

C:\Users\<User>\AppData\Local\Microsoft\VisualStudio\12.0\Designer\ShadowCache\4olitigs.k2m\hj4ewy5v.g23\MyApplication.dll

Could not load file or assembly 'MyApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. This assembly was compiled for a different processor.

雖然在原始工作站上還不錯,但第二個卻失敗了。 原來,這是項目屬性的“ 構建”選項卡中的“ 平台”目標 至少在我們的情況下,需要將其設置為“任何CPU”,以避免機器之間的差異。

僅供將來參考,對我來說,解決方案是我沒有在xmlns CLR名稱空間定義的末尾添加“; assembly = MyAssembly”。

對我來說,解決方案是將以下幾行添加到項目文件.csproj<\/code>

<PropertyGroup>
    <RootNamespace>AssemblyName</RootNamespace>
    <AssemblyName>AssemblyName</AssemblyName>
</PropertyGroup>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM