2013-07-17 21 views
5

Tôi có một vấn đề với một usercontrol wpf đó là của riêng tôi nghĩ ra. Vấn đề là tôi nhận được một ngoại lệ object reference not set to an instance of an object trong mã XAML trong khi thiết kế thời gian, khi tôi triển khai usercontrol trong chương trình của mình.Làm thế nào để tránh một "tham chiếu đối tượng không được đặt thành một thể hiện của một đối tượng" ngoại lệ trong mã XAML trong khi thiết kế thời gian?

Tôi có thể sửa hoặc ngăn chặn ngoại lệ như thế nào?

EDIT 1

Các nhà thiết kế cho tôi các thông tin sau:

tại Microsoft.Expression.Platform.InstanceBuilders.InstanceBuilderOperations.InstantiateType (Type loại, Boolean supportInternal) tại Microsoft.Expression. Platform.InstanceBuilders.ClrObjectInstanceBuilder.InstantiateTargetType (IInstanceBuilderContext ngữ cảnh, chế độ xem ViewNode) tại Microsoft.Expression.Platform.InstanceBuilders.ClrObjectInstanceBuilder.Instantiate (II nstanceBuilderContext bối cảnh, ViewNode viewNode) tại Microsoft.Expression.WpfPlatform.InstanceBuilders.FrameworkElementInstanceBuilder.Instantiate (IInstanceBuilderContext bối cảnh, ViewNode viewNode) tại Microsoft.Expression.WpfPlatform.InstanceBuilders.UserControlInstanceBuilder.Instantiate (IInstanceBuilderContext bối cảnh, ViewNode viewNode) tại Microsoft.Expression.Platform.InstanceBuilders.ViewNodeManager.CreateInstance (IInstanceBuilder builder, viewNode viewNode)

tôi nghĩ rằng họ không thực sự hữu ích ...

+1

Nhà thiết kế sẽ hiển thị cho bạn dấu vết ngăn xếp của lỗi - lỗi thực sự xảy ra ở đâu? – Tim

+0

Vui lòng đăng một phần của mã mà phát sinh lỗi. Thực sự khó trả lời câu hỏi với thông tin được cung cấp – Koushik

+1

bản sao có thể có của [WPF, 'Tham chiếu đối tượng không được đặt thành thể hiện của đối tượng' trong thiết kế] (http://stackoverflow.com/questions/3533539/wpf-object- reference-not-set-to-an-instance-of-an-đối tượng-in-designer) – Viv

Trả lời

0

Bạn có thể làm một cái gì đó như thế này:

using System.ComponentModel; 
using System.Windows; 

/// <summary> 
/// WPF Design Mode helper class. 
/// </summary> 
public static class DesignMode 
{ 
    private static bool? _isInDesignMode; 

    /// <summary> 
    /// Gets a value indicating whether the control is in design mode (running in Blend 
    /// or Visual Studio). 
    /// </summary> 
    public static bool IsInDesignMode 
    { 
     get 
     { 
      if (!_isInDesignMode.HasValue) 
      { 
       var prop = DesignerProperties.IsInDesignModeProperty; 
       _isInDesignMode 
        = (bool)DependencyPropertyDescriptor 
        .FromProperty(prop, typeof(FrameworkElement)) 
        .Metadata.DefaultValue; 
      } 

      return _isInDesignMode.Value; 
     } 
    } 
} 

Sau đó, khi dòng đầu tiên trong constructor của view (hoặc mô hình xem), bạn có thể làm điều gì đó như thế này:

if (DesignMode.IsInDesignMode) { return; } 

Bằng cách đó mã của bạn sẽ chỉ chạy khi bạn thực sự chạy nó.

+0

nó không hoạt động .. nhưng cảm ơn câu trả lời của bạn. – Kimbo

6

Bất cứ điều gì xảy ra trong hàm tạo của bạn đều là một ngoại lệ trong thời gian thiết kế. Tôi đã có cùng một vấn đề - Tôi chỉ cần đặt một thử bắt xung quanh mã có vấn đề - trong trường hợp của tôi, tôi đã gọi ServiceLocator.Current như tôi đang sử dụng một container IoC. Nhưng không có container trong thời gian thiết kế. Vì vậy, tôi bọc trong một cố gắng nắm bắt để ngăn chặn các lỗi và nó làm việc. Không phải là giải pháp tốt nhất ... nhưng nó là một giải pháp.

3

Tôi có xu hướng sử dụng lớp LicenseManager trong System.ComponentModel để tránh các Chế độ xem của tôi ném các lỗi khó chịu vào thời gian chết. Ví dụ:

public MyViewModel() 
{ 
    if (LicenseManager.UsageMode == LicenseUsageMode.Runtime) 
    { 
    // Do runtime stuff 
    } 
} 
1

Tweaking @ dụ BobHorn, tôi nhận được điều này để làm việc cho tôi:

public class ViewModel 
{ 
    public ViewModel() 
    { 
     if (!IsInDesignMode) 
     { 
      //Constructor code here... 
     } 
    } 
    public bool IsInDesignMode 
    { 
     get 
     { 
      var prop = DesignerProperties.IsInDesignModeProperty; 
      return (bool)DependencyPropertyDescriptor 
       .FromProperty(prop, typeof(FrameworkElement)) 
       .Metadata.DefaultValue; 
     } 
    } 
} 

Mặc dù sử dụng gợi ý chính xác của mình cho các nhà xây dựng

public Main() 
{ 
    if (IsInDesignMode) { return; } 
    //Constructor code here... 
} 

cũng đã làm việc cho tôi , Tôi không thích viết tắt các phương thức của tôi với các câu lệnh trả về thêm. Tôi đã lên tiếng bình chọn câu trả lời của anh ấy, chưa có đại diện.

0

Tôi cũng gặp sự cố tương tự. Bạn cần phải đi đến Tools> Options> XAML thiết kế và cho phép tùy chọn

"Run mã dự án trong thiết kế XAML".

Cuối cùng khởi động lại Visual Studio. Hy vọng điều này có thể giúp cho bạn.

+3

Bạn đang sử dụng phiên bản Visual Studio nào? Tôi không thể tìm thấy phần "XAML Designer" trong Visual Studio 2013. – jv42

5

Nếu bạn có 'tham chiếu đối tượng không được đặt thành một thể hiện của đối tượng' trong XAML, nhưng ứng dụng của bạn biên dịch và chạy tốt, bạn thường sẽ tìm ra nguyên nhân của nó là thứ gì đó trong một hàm tạo không thể giải quyết được thời gian thiết kế.

Bạn có thể chỉ cần nhấp vào nút "Tắt mã dự án" ở cuối chế độ xem thiết kế của bạn và trình thiết kế Visual Studio sẽ ngừng cố gắng tạo một cá thể để cung cấp chế độ xem dữ liệu thời gian thiết kế.

Xem here để biết thông tin chi tiết và ảnh chụp màn hình.

+0

'Tắt mã dự án' đã hoạt động .. – Mangesh

0

VS 2017 UWP:

if (false == Windows.ApplicationModel.DesignMode.DesignModeEnabled) 
{ 
    // Anything in here need not be OK at Design time in Visual Studio     
} 
0

Trong bạn "partial class" của XAML, nếu bạn có thể nhìn thấy "[XamlCompilation(XamlCompilationOptions.Compile)]", chỉ loại bỏ các dòng, và sau đó cố gắng xây dựng lại.

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