Có thuộc tính DesignMode trong WPF không?


Câu trả lời:


152

Thật vậy có :

System.ComponentModel.DesignerProperties.GetIsInDesignMode

Thí dụ:

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

public class MyUserControl : UserControl
{
    public MyUserControl()
    {
        if (DesignerProperties.GetIsInDesignMode(this))
        {
            // Design-mode specific functionality
        }
    }
}

Tôi đã áp dụng giải pháp của bạn trong ứng dụng của mình nhưng nó không hoạt động. Tôi đã hỏi nó ở đây stackoverflow.com/questions/3987439/… . Nếu bạn muốn, hãy tham gia cùng chúng tôi và thảo luận.
Nam G VU

@serhio Cảm ơn bạn đã chỉ ra điều đó. Bạn có biết về bất kỳ giải pháp nào không? Btw có vẻ như nó không hoạt động trong Silverlight hoặc: connect.microsoft.com/VisualStudio/feedback/details/371837/...
Enrico Campidoglio

Trong VS2019, công tắc Enable project codephải được bật (hoặc Menu-> Design-> 🗹 Run Project Code).
marbel82

47

Trong một số trường hợp tôi cần biết, liệu một lệnh gọi đến lớp không phải UI của tôi có được khởi tạo bởi trình thiết kế hay không (như nếu tôi tạo một lớp DataContext từ XAML). Sau đó, cách tiếp cận từ bài viết MSDN này rất hữu ích:

// Check for design mode. 
if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
{
    //in Design mode
}

Tôi đã áp dụng giải pháp của bạn trong ứng dụng của mình nhưng nó không hoạt động. Tôi đã hỏi nó ở đây stackoverflow.com/questions/3987439/… . Nếu bạn muốn, hãy tham gia cùng chúng tôi và thảo luận.
Nam G VU

20

Đối với bất kỳ Điều khiển WPF nào được lưu trữ trong WinForms , DesignerProperties.GetIsInDesignMode(this)không hoạt động.

Vì vậy, tôi đã tạo một lỗi trong Microsoft Connect và thêm một cách giải quyết:

public static bool IsInDesignMode()
{
    if ( System.Reflection.Assembly.GetExecutingAssembly().Location.Contains( "VisualStudio" ) )
    {
        return true;
    }
    return false;
}

Không nên GetEntryAssembly()thay vì GetExecutingAssembly()? Sau này nên được trả lại assembly mà tài sản này được định nghĩa
fjch1997

7

Câu trả lời muộn, tôi biết - nhưng đối với bất kỳ ai khác muốn sử dụng điều này trong một DataTriggerhoặc bất kỳ đâu trong XAML nói chung:

xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=PresentationFramework"

<Style.Triggers>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, 
                 Path=(componentModel:DesignerProperties.IsInDesignMode)}" 
                 Value="True">
        <Setter Property="Visibility" Value="Visible"/>
    </DataTrigger>
</Style.Triggers>

0

Sử dụng cái này:

if (Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{
    //design only code here
}

(Các hoạt động không đồng bộ và tệp sẽ không hoạt động ở đây)

Ngoài ra, để khởi tạo một đối tượng thời gian thiết kế trong XAML (d là không gian tên của nhà thiết kế đặc biệt)

<Grid d:DataContext="{d:DesignInstance Type=local:MyViewModel, IsDesignTimeCreatable=True}">
...
</Grid>

Lớp đó ( Windows.ApplicationModel) dành cho các ứng dụng Store, được bao gồm trong Windows Runtime API. Đây không phải là giải pháp WPF có sẵn nếu bạn chỉ đang làm việc trên một ứng dụng máy tính để bàn Windows thông thường.
qJake
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.