2011-11-28 28 views
12

Tôi có một bộ kiểu rất đơn giản mà tôi đang sử dụng trong một vài ứng dụng WPF khác nhau. Tôi có kiểu này được lưu trữ trong một tệp Xaml trong một dự án chung, sau đó được thêm bằng cách hợp nhất vào Resources trong App.xaml trong mỗi dự án.Kiểu TargetType gây ra XamlParseException khi không được đính kèm với trình gỡ lỗi

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" 
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"> 
    <Style TargetType="dxe:ComboBoxEdit"> 
     <Setter Property="AutoComplete" Value="True" /> 
     <Setter Property="IncrementalFiltering" Value="True" /> 
     <Setter Property="ImmediatePopup" Value="True" /> 
     <Setter Property="IsTextEditable" Value="True" /> 
     <Setter Property="ClearSelectionOnBackspace" Value="True" /> 
    </Style> 
    <Style TargetType="dxe:ComboBoxEditSettings"> 
     <Setter Property="AutoComplete" Value="True" /> 
     <Setter Property="IncrementalFiltering" Value="True" /> 
     <Setter Property="ImmediatePopup" Value="True" /> 
     <Setter Property="IsTextEditable" Value="True" /> 
    </Style> 
</ResourceDictionary> 

Thật không may, một cái gì đó về vấn đề này đang gây ra một XamlParseException về TargetType bất động sản, nhưng chỉ khi không gắn liền với debugger. Nếu tôi khởi động ứng dụng trong trình gỡ lỗi, mọi thứ đều ổn. Nếu tôi "Start Without Debugging", tôi có được điều này như App.xaml đang được nạp:

System.Windows.Markup.XamlParseException: 'Failed to create a 'TargetType' from the text 'dxe:ComboBoxEdit'.' Line number '5' and line position '12'. ---> System.Xaml.XamlParseException: Type reference cannot find type named '{http://schemas.devexpress.com/winfx/2008/xaml/editors}ComboBoxEdit'. 
    at MS.Internal.Xaml.Context.ObjectWriterContext.ServiceProvider_Resolve(String qName) 
    at MS.Internal.Xaml.ServiceProviderContext.System.Windows.Markup.IXamlTypeResolver.Resolve(String qName) 
    at System.Xaml.Replacements.TypeTypeConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value) 
    at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateObjectWithTypeConverter(ServiceProviderContext serviceContext, XamlValueConverter`1 ts, Object value) 
    at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateFromValue(ServiceProviderContext serviceContext, XamlValueConverter`1 ts, Object value, XamlMember property) 
    at System.Xaml.XamlObjectWriter.Logic_CreateFromValue(ObjectWriterContext ctx, XamlValueConverter`1 typeConverter, Object value, XamlMember property, String targetName, IAddLineInfo lineInfo) 
    --- End of inner exception stack trace --- 
    at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri) 
    at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) 
    at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri) 
    at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream) 
    at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) 
    at Shell.App.InitializeComponent() in c:\DevProjects\CoreApplication\Shell\App.xaml:line 1 
    at Shell.App.Main() in C:\DevProjects\CoreApplication\Shell\obj\x86\Debug\App.g.cs:line 0 

Nếu tôi nhận xét ra cả Style nút, sau đó mọi thứ hoạt động một cách chính xác. Ý tưởng nào?

+0

Còn cú pháp 'TargetType =" {x: Type } "thì sao? – Jay

+0

@Jay: Không may là kết quả tương tự. –

+0

Bạn có đặt các kiểu điều khiển tùy chỉnh của mình bên trong Chủ đề/Generic.xaml không? –

Trả lời

28

Tôi đã có cùng một loại vấn đề và đối với tôi đó là cách các tệp tài nguyên được thêm vào dự án.

Tôi phải đảm bảo mỗi và mọi tệp tài nguyên kiểu xaml của tôi được thiết lập là "Trang" (trong thuộc tính "tác vụ xây dựng"). Theo mặc định, chúng không phải tất cả trong chế độ này (một số là "Nội dung", một số khác là "biên dịch" hoặc "tài nguyên được nhúng" hoặc "tài nguyên") và rằng gây ra loại sự cố này.

có lẽ đó là tương tự cho bạn ...

chỉnh sửa: từ những gì tôi có thể thu thập, nó có cái gì để làm với cách mã XAML được nhúng vào trong dự án và đặc biệt là tự trong đó nó được phân tách bởi WPF: nếu các tập tin nguồn được thiết lập như là "trang", thứ tự mà điển được sáp nhập không được đưa vào tính toán, vì vậy đây sẽ làm việc trong chế độ phát hành:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <!-- let's say this dictionary contains a call to "MyButtonStyle" ... --> 
      <ResourceDictionary Source="resources/Common.xaml" /> 
      <!-- ... and this one contains the definition of "MyButtonStyle" --> 
      <ResourceDictionary Source="resources/GeneralResources.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

nhưng điều này sẽ không làm việc với các tùy chọn khác (không phải tất cả chúng, tôi không ry mỗi một người trong số họ) kể từ khi cuộc gọi sẽ được phân tích cú pháp trước khi định nghĩa. Vì lý do tại sao nó hoạt động trong chế độ gỡ lỗi và không trong bản phát hành (hoặc trong trường hợp của bạn khi bạn bắt đầu mà không gỡ lỗi), tôi đoán đó là vì WPF phân tích và lưu trữ tài nguyên vào bộ nhớ khác nhau tùy thuộc vào chế độ bạn đang ở (gỡ lỗi hay không). Tôi nghĩ rằng WPF lưu trữ tất cả mọi thứ trong bộ nhớ trong chế độ gỡ lỗi trong khi nó chỉ lưu trữ những gì nó cần trong chế độ phát hành (ví dụ như mã gọi và không phải là mã định nghĩa), nhưng sau đó một lần nữa, nó chỉ là của tôi ...

chỉnh sửa 2: đối với tôi đó là một cơn ác mộng để gỡ lỗi vì nó còn tồi tệ hơn: nó hoạt động trong một số cấu hình phát hành và không phải do người khác tùy thuộc vào thứ tự của hành động mà người dùng thực hiện, anh ta sẽ gặp lỗi hay không đã được tính phí trong bộ nhớ hay không khi được gọi, tùy thuộc vào những gì WPf đã cần thiết vào thời điểm này), và tất nhiên tôi không thể "gỡ lỗi" cho mỗi nói, kể từ khi chế độ gỡ lỗi luôn luôn làm việc ... Phải mất một thời gian trước khi figuring này giải pháp ra ... vui vì nó đã giúp

+0

Cuộc gọi đẹp! Điều đó giải quyết được vấn đề. Để công bằng, mặc dù, tôi đã nêu trong mô tả tiền thưởng mà tôi muốn có một lời giải thích của * tại sao * nó theo cách này; bất kỳ ý tưởng? –

+0

xem chỉnh sửa của tôi, nhưng như được viết, không có gì được chứng minh, nó chỉ là những gì tôi suy ra :) – David

+1

Cảm ơn; nó không hoàn toàn phù hợp với kinh nghiệm của tôi (tôi chưa bao giờ thực sự được xây dựng trong chế độ phát hành, nó luôn được biên dịch trong chế độ gỡ lỗi và sẽ làm việc với trình gỡ lỗi * đính kèm * nhưng không phải với nó * tách ra *). Trong mọi trường hợp, đó là giải thích tốt như tôi đã có thể tìm thấy, vì vậy tôi sẽ trao tiền thưởng khi bộ đếm thời gian lên (~ 5 phút kể từ bây giờ) –

1

Bạn có tham chiếu đến dlls devexpress trong proj ect có app.xaml.cs? nếu không thử bằng cách thêm tham chiếu ..

Ngoài ra, hãy kiểm tra tải lắp ráp bằng cách sử dụng fuslogvw.exe và đảm bảo các tệp tải xuống được tải.

+0

Tôi đã không thử bước thứ hai của bạn, nhưng có, cả hai dự án chung (trong đó có các tập tin Xaml) và dự án chính (với App.xaml) có tham chiếu đến DLL có chứa các đối tượng này. –

+0

+1 là một ý tưởng hay, nhưng câu trả lời khác giải quyết được vấn đề của tôi. Cảm ơn! –

4

Đối với tôi, điều gì đã làm việc hơi khác một chút. Tôi đã thiết lập các hành động xây dựng để 'Trang', nhưng bất kỳ thư mục tôi đã phải loại bỏ. Ví dụ:

<ResourceDictionary Source="resources/Common.xaml" /> 

sẽ trở thành

<ResourceDictionary Source="Common.xaml" /> 

Đáng chú ý, tôi đã liên kết các file kể từ khi tôi đã chia sẻ chúng với Silverlight

0

Tôi đã nhận được một XamlParseException với thông điệp "Không thể tạo một ' Nhập 'từ văn bản': ScatterViewItem '", nhưng chỉ khi chạy ứng dụng trực tiếp, không phải từ trình gỡ rối Visual Studio.

This external answer nói với tôi rằng, vì lý do gì đó, lắp ráp cần thiết chưa được tải. This StackOverflow answer chỉ cho tôi cách tạo một hàm Main() cho ứng dụng WPF của tôi. Tôi chỉ cần đặt "new ScatterViewItem();" ở trên cùng của Main() của tôi, và vấn đề đã biến mất!

Tôi không biết điều gì đang xảy ra ở đây, đặc biệt là vì ScatterViewItem được kèm theo một ScatterView từ cùng một assembly. Nó chắc chắn giống như một lỗi khó chịu trong phân tích cú pháp XAML.

Các vấn đề liên quan