ডাব্লুপিএফ বর্তমানে ডিজাইন মোডে কার্যকর করছে কিনা তা যাচাই করার কোনও উপায় আছে কি না?


147

যে কোনও বিশ্বব্যাপী রাষ্ট্রীয় পরিবর্তনশীল উপলভ্য তা সম্পর্কে কি জানেন যাতে কোডটি বর্তমানে ডিজাইন মোডে (যেমন মিশ্রিত বা ভিজ্যুয়াল স্টুডিওতে) কার্যকর করা হচ্ছে কিনা তা আমি পরীক্ষা করতে পারি?

এটি দেখতে এমন কিছু লাগবে:

//pseudo code:
if (Application.Current.ExecutingStatus == ExecutingStatus.DesignMode) 
{
    ...
}

আমার এটির কারণটি হ'ল: যখন আমার অ্যাপ্লিকেশনটি এক্সপ্রেশন ব্লেন্ডে ডিজাইন মোডে প্রদর্শিত হচ্ছে, আমি চাই ভিউমোডেল পরিবর্তে একটি "ডিজাইন গ্রাহক শ্রেণি" ব্যবহার করা উচিত যাতে এতে মক ডেটা থাকে যা ডিজাইনার ডিজাইন মোডে দেখতে পারে।

যাইহোক, যখন অ্যাপ্লিকেশনটি আসলে কার্যকর হচ্ছে, আমি অবশ্যই চাই ভিউমোডেলটি সত্যিকারের গ্রাহক শ্রেণিটি ব্যবহার করুক যা আসল ডেটা দেয়।

বর্তমানে আমি এটির ডিজাইনার তৈরি করে এটির কাজ করার আগে এটি সমাধান করি, ভিউমোডেলে যান এবং "অ্যাপ্লিকেশন ডেভেলপমেন্ট মোড.এক্সেকটিং "টিকে" অ্যাপ্লিকেশন ডেভেলপমেন্টমড.ডিজাইনিং "এ পরিবর্তন করুন:

public CustomersViewModel()
{
    _currentApplicationDevelopmentMode = ApplicationDevelopmentMode.Designing;
}

public ObservableCollection<Customer> GetAll
{
    get
    {
        try
        {
            if (_currentApplicationDevelopmentMode == ApplicationDevelopmentMode.Developing)
            {
                return Customer.GetAll;
            }
            else
            {
                return CustomerDesign.GetAll;
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }
}

উত্তর:


226

আমি বিশ্বাস করি আপনি গেটআইসইন ডিজাইনমোড খুঁজছেন , যা নির্ভরতা অবজেক্ট নেয়।

অর্থাৎ।

// 'this' is your UI element
DesignerProperties.GetIsInDesignMode(this);

সম্পাদনা: সিলভারলাইট / WP7 ব্যবহার করার সময়, আপনি ব্যবহার করা উচিত IsInDesignToolযেহেতু GetIsInDesignModeকখনও কখনও ভিসুয়াল স্টুডিও মিথ্যা যখন আসতে পারেন:

DesignerProperties.IsInDesignTool

সম্পাদনা: এবং পরিশেষে, সম্পূর্ণতার স্বার্থে, উইনআরটি / মেট্রো / উইন্ডোজ স্টোর অ্যাপ্লিকেশনগুলির সমতুল্য DesignModeEnabled:

Windows.ApplicationModel.DesignMode.DesignModeEnabled

3
পার্শ্ব নোট হিসাবে, আইসআইডিজাইনমোড আসলে একটি সংযুক্ত সম্পত্তি, তাই আপনি এটি এক্সএএমএল থেকেও একটি বাইন্ডিংয়ে ব্যবহার করতে পারেন। যদিও সবচেয়ে সাধারণ ব্যবহার হতে পারে না :)
এএল 3891

3
উইনআরটি এবং ডাব্লুপি'র মতো সর্বশেষ এক্সএএমএল "অ্যাপ্লিকেশনগুলি" দিয়ে উত্তরটি আপ টু ডেট রাখার জন্য ধন্যবাদ।
সেভেনেট

VS2019 এ স্যুইচ Enable project codeসক্ষম করতে হবে (বা মেনু-> ডিজাইন-> Project প্রকল্প কোড চালান)।
মার্বেল 82

115

আপনি এর মতো কিছু করতে পারেন:

DesignerProperties.GetIsInDesignMode(new DependencyObject());

30
এই পদ্ধতিটি ভিউমোডেলগুলি ডিজাইনার-বান্ধব করে তোলার জন্যও কাজ করে (যেহেতু তারা নিজেরাই DependencyObjects নয়)।
প্যাট

1
DependencyObject এর সুরক্ষিত কনস্ট্রাক্টর রয়েছে - এর পরিবর্তে সংজ্ঞা internal class MyDependencyObject : DependencyObject {}এবং ব্যবহার new MyDependencyObjectকরুনDependencyObject
রিকো সুটার


যদি কোনও ভিউ মডেলটিতে এটি করা হয় আপনি সম্ভবত এটি বিমূর্ত করে একটি স্ট্যাটিক শ্রেণিতে পরিণত করতে চান এবং
ফলাফলটিকে

24
public static bool InDesignMode()
{
    return !(Application.Current is App);
}

যে কোনও জায়গা থেকে কাজ করে। আমি এটি ডিজাইনারটিতে ডেটাবাউন্ড ভিডিওগুলি খেলতে বাধা দেওয়ার জন্য ব্যবহার করি।


উপরের দিকের একটি প্রকরণ Application.Current.MainWindow == nullযদিও আমি টাইপ পরীক্ষাটি আরও ভাল, আরও সরাসরি পছন্দ করি। এটি ভিজ্যুয়াল স্টুডিওতে হোস্ট করা ডিজাইনার সংস্থান যুক্ত করার পরেও উপস্থিত হয়, তাই এটি করার আরও একটি উপায় এখানে রয়েছে (যদি Appআপনার কোডটি হোস্টিংয়ের লাইব্রেরিতে নির্দিষ্ট ধরণের অ্যাক্সেস না থাকে ) ((bool)Application.Current.Resources["ExpressionUseLayoutRounding"])। যদি উত্সটি না থাকে তবে চেক দরকার তবে এটি ডিজাইনার প্রসঙ্গে কাজ করে।
জন লিডেগ্রেন

9

যখন ভিজ্যুয়াল স্টুডিও অটো আমার জন্য কিছু কোড উত্পন্ন করেছিল এটি ব্যবহৃত হয়েছিল

if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) 
{
    ...
}

9

সম্পর্কিত সম্পর্কিত বর্ণনায় যেমন ডাব্লুপিএফ-এ ডিজাইনের-সময় ডেটা নির্দিষ্ট করার অন্যান্য (সম্ভবত আরও নতুন) উপায় রয়েছে ।

মূলত, আপনি নিজের ভিউমোডেলের ডিজাইন-সময় উদাহরণ ব্যবহার করে ডিজাইন-সময় ডেটা নির্দিষ্ট করতে পারেন :

d:DataContext="{d:DesignInstance Type=v:MySampleData, IsDesignTimeCreatable=True}"

বা একটি এক্সএএমএল ফাইলে নমুনা ডেটা নির্দিষ্ট করে :

d:DataContext="{d:DesignData Source=../DesignData/SamplePage.xaml}">

আপনি SamplePage.xamlফাইল বৈশিষ্ট্য সেট করতে হবে:

BuildAction:               DesignData
Copy to Output Directory:  Do not copy
Custom Tool:               [DELETE ANYTHING HERE SO THE FIELD IS EMPTY]

আমি এগুলি আমার UserControlট্যাগটিতে রাখি :

<UserControl
    ...
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    ...
    d:DesignWidth="640" d:DesignHeight="480"
    d:DataContext="...">

রান-টাইমে, সমস্ত "d:" ডিজাইন-টাইম ট্যাগগুলি অদৃশ্য হয়ে যায়, সুতরাং আপনি কেবলমাত্র নিজের রান-টাইম ডেটা প্রসঙ্গ পাবেন, তবে আপনি এটি সেট করতে বেছে নিই।

সম্পাদনা করার জন্য আপনার এই লাইনগুলিও লাগতে পারে (আমি নিশ্চিত না, তবে এগুলি প্রাসঙ্গিক বলে মনে হচ্ছে):

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 

7

এবং যদি আপনি আপনার বৃহত ডাব্লুএফএফ / সিলভারলাইট / ডাব্লুপি 8 / উইনআরটি অ্যাপ্লিকেশনের জন্য ক্যালিবার্ন.মাইক্রোটি ব্যাপকভাবে ব্যবহার করেন তবে আপনি নিজের ভিউ-মডেলগুলিতে হ্যান্ডি এবং সর্বজনীন ক্যালিবার্নের স্থিতিশীল সম্পত্তিটিও ব্যবহার করতে পারেন (এবং এটি ভিজ্যুয়াল স্টুডিওতে যেমন ব্লেন্ডে কাজ করে):Execute.InDesignMode

using Caliburn.Micro;

// ...

/// <summary>
/// Default view-model's ctor without parameters.
/// </summary>
public SomeViewModel()
{
    if(Execute.InDesignMode)
    {
        //Add fake data for design-time only here:

        //SomeStringItems = new List<string>
        //{
        //  "Item 1",
        //  "Item 2",
        //  "Item 3"
        //};
    }
}

2

আমি এটি কেবল ভিজ্যুয়াল স্টুডিও 2013 এবং .NET 4.5 দিয়ে পরীক্ষা করেছি কিন্তু এটি কৌশলটি কার্যকর করে।

public static bool IsDesignerContext()
{
  var maybeExpressionUseLayoutRounding =
    Application.Current.Resources["ExpressionUseLayoutRounding"] as bool?;
  return maybeExpressionUseLayoutRounding ?? false;
}

এটি সম্ভব যদিও ভিজ্যুয়াল স্টুডিওতে কিছু সেটিং এই মানটিকে মিথ্যাতে বদলে দেবে, যদি এমনটি ঘটে থাকে তবে আমরা কেবলমাত্র এই সংস্থানটির নাম বিদ্যমান কিনা তা খতিয়ে দেখতে পারা যেতে পারি। মনে হচ্ছিল nullআমি যখন ডিজাইনার বাহিরে আমার কোড দৌড়ে।

এই পদ্ধতির উল্টো দিকটি হ'ল এর জন্য নির্দিষ্ট Appশ্রেণীর সুস্পষ্ট জ্ঞানের প্রয়োজন হয় না এবং এটি আপনার কোড জুড়ে বিশ্বব্যাপী ব্যবহার করা যেতে পারে। বিশেষত ডামি ডেটা সহ ভিউ মডেলগুলি জনবসতিপূর্ণ করতে।


2

গৃহীত উত্তর আমার পক্ষে কার্যকর হয়নি (VS2019)।

যা চলছে তা পরিদর্শন করার পরে আমি এটি নিয়ে এসেছি:

    public static bool IsRunningInVisualStudioDesigner
    {
        get
        {
            // Are we looking at this dialog in the Visual Studio Designer or Blend?
            string appname = System.Reflection.Assembly.GetEntryAssembly().FullName;
            return appname.Contains("XDesProc");
        }
    }

এটি আমার জন্য কাজ করেছে যেখানে আমার ভিউমোডেলের মধ্যে থেকে ডিজাইনের সময় চলছে এবং উইন্ডোজ লাইব্রেরি ব্যবহার করতে পারছি না তা জানতে আমার প্রয়োজন হয়েছিল। আমি জানি এটি খুব স্বল্প পরিমাণে প্রতিচ্ছবি তবে এটি উত্পাদন নিয়ে চলার চিন্তাভাবনাটি আমার পছন্দ হয়নি তাই আমি এই কোডটিকে #if DEBUGঅন্য কোনও মিথ্যা ফেরত দিয়ে জড়িয়েছি। তা না করার কোনও কারণ আছে কি?
টবি স্মিথ

1

আপনার ক্লাসে যদি কোনও খালি নির্মাণকারীর প্রয়োজন না হয় তবে আপনার জন্য আমার একটি ধারণা রয়েছে।

ধারণাটি হ'ল একটি খালি কনস্ট্রাক্টর তৈরি করা, তারপরে এটিকে অপসোলিটএট্রিবিউট দিয়ে চিহ্নিত করুন। ডিজাইনারটি অপ্রচলিত বৈশিষ্ট্যটিকে উপেক্ষা করে, তবে আপনি যদি এটি ব্যবহার করার চেষ্টা করেন তবে সংকলক একটি ত্রুটি বাড়িয়ে তুলবে, সুতরাং এটি নিজেই ব্যবহার করে দুর্ঘটনার কোনও ঝুঁকি নেই।

( আমার ভিজ্যুয়াল বেসিকে ক্ষমা করুন )

Public Class SomeClass

    <Obsolete("Constructor intended for design mode only", True)>
    Public Sub New()
        DesignMode = True
        If DesignMode Then
            Name = "Paula is Brillant"
        End If
    End Sub

    Public Property DesignMode As Boolean
    Public Property Name As String = "FileNotFound"
End Class

এবং এক্সএএমএল:

<UserControl x:Class="TestDesignMode"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:vm="clr-namespace:AssemblyWithViewModels;assembly=AssemblyWithViewModels"
             mc:Ignorable="d" 
             >
  <UserControl.Resources>
    <vm:SomeClass x:Key="myDataContext" />
  </UserControl.Resources>
  <StackPanel>
    <TextBlock d:DataContext="{StaticResource myDataContext}" Text="{Binding DesignMode}" Margin="20"/>
    <TextBlock d:DataContext="{StaticResource myDataContext}" Text="{Binding Name}" Margin="20"/>
  </StackPanel>
</UserControl>

উপরের কোড ফলাফল

আপনার যদি সত্যিই অন্য কোনও কিছুর জন্য খালি নির্মাণকারীর প্রয়োজন হয় তবে এটি কাজ করবে না ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.