উইন্ডো বন্ধ হওয়ার ইভেন্টটি ডাব্লুপিএফ / এমভিভিএম লাইট টুলকিট দিয়ে পরিচালনা করছে


145

Closingশেষ পর্যন্ত একটি নিশ্চিত বার্তা প্রদর্শন করতে বা / এবং বন্ধটি বাতিল করতে আমি আমার উইন্ডোর উপরের ডানদিকে 'এক্স' বোতামটি ক্লিক করে) ইভেন্টটি পরিচালনা করতে চাই ।

কোড-পিছনে এটি কীভাবে করা যায় তা আমি জানি: Closingউইন্ডোটির ইভেন্টটিতে সাবস্ক্রাইব করুন তারপরে CancelEventArgs.Cancelসম্পত্তিটি ব্যবহার করুন ।

তবে আমি এমভিভিএম ব্যবহার করছি তাই আমি নিশ্চিত না যে এটি ভাল পদ্ধতির।

আমি মনে করি ভাল ভিউটি হবে আমার ভিউমোডেলটিতে Closingইভেন্টটি আবদ্ধ করা Command

আমি চেষ্টা করেছি:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Closing">
        <cmd:EventToCommand Command="{Binding CloseCommand}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

RelayCommandআমার ভিউমোডেল সম্পর্কিত কোনও সাথে তবে এটি কাজ করে না (কমান্ডের কোডটি কার্যকর হয় না)।


3
এটির উত্তরের উত্তরেও আগ্রহী।
সেখাত

3
আমি কোডপ্লেক্স থেকে কোডটি ডাউনলোড করেছি এবং এটি ডিবাগিং থেকে প্রকাশিত হয়েছে: "সিস্টেম.কম্পোনমেন্টমোডেল.ক্যান্সেলএভেন্টআর্গস 'টাইপ করতে' সিস্টেম. উইন্ডোস.রউটেড এভেঞ্জআরগস 'টাইপ করতে পারা যায় না।" আপনি যদি ক্যান্সেলএভেন্টআরগস না চান তবে এটি ঠিক আছে তবে এটি আপনার প্রশ্নের উত্তর দেয় না ...
ডেভিড হলিনহেড

আমি অনুমান করছি যে আপনার কোডটি কার্যকর হয় না কারণ আপনি নিজের ট্রিগারটি যে সংযোজনটিতে সংযুক্ত করেছেন তাতে কোনও ক্লোজিং ইভেন্ট নেই। আপনার ডেটা প্রসঙ্গটি উইন্ডো নয় ... এটি সম্ভবত গ্রিড বা এমন কিছু সহ একটি ডেটা টেমপ্লেট, যার কোনও সমাপ্তির ইভেন্ট নেই। সুতরাং ডিবিকেকের উত্তর এই ক্ষেত্রে সেরা উত্তর। যাইহোক, ইভেন্টটি উপলভ্য হওয়ার পরে আমি ইন্টারঅ্যাকশন / ইভেন্টট্রিজার পদ্ধতির পছন্দ করি prefer
নিলডাব্লু

আপনার কোডটি একটি লোড ইভেন্টে দুর্দান্ত কাজ করবে, উদাহরণস্বরূপ।
নিলডব

উত্তর:


126

আমি কেবল ভিউ কনস্ট্রাক্টরে হ্যান্ডলারটি যুক্ত করব:

MyWindow() 
{
    // Set up ViewModel, assign to DataContext etc.
    Closing += viewModel.OnWindowClosing;
}

তারপরে হ্যান্ডলারটি যুক্ত করুন ViewModel:

using System.ComponentModel;

public void OnWindowClosing(object sender, CancelEventArgs e) 
{
   // Handle closing logic, set e.Cancel as needed
}

এই ক্ষেত্রে, আপনি আরও বেশি দিকনির্দেশ (এক্সএএমএল প্লাস Commandপ্যাটার্নের 5 টি অতিরিক্ত লাইন ) সহ আরও বিস্তৃত প্যাটার্ন ব্যবহার করে জটিলতা ব্যতীত অন্য কিছুই অর্জন করতে পারেন না ।

"শূন্য কোড-পিছনে" মন্ত্রোচ্চারণের লক্ষ্য নিজেই নয়, পয়েন্ট হয় দেখুন থেকে ViewModel decouple । এমনকি ইভেন্টটি কোডের পিছনে সীমাবদ্ধ থাকা সত্ত্বেও, ভিউয়ের ViewModelউপর নির্ভর করে না এবং সমাপ্তি যুক্তিটি ইউনিট-পরীক্ষা করা যেতে পারে


4
আমি এই সমাধানটি পছন্দ করি : কেবল একটি লুকানো বোতামে
ঝাঁকুন

3
এমভিভিএম শুরুর জন্য এমভিভিএমএলাইট ব্যবহার না করে এবং কীভাবে ক্লোজিং ইভেন্ট সম্পর্কে ভিউমোডেলকে অবহিত করা যায় তা অনুসন্ধান করার জন্য, কীভাবে ডেটা কনটেক্সটটি সঠিকভাবে সেটআপ করতে হবে এবং ভিউতে ভিডমোডেল অবজেক্টটি কীভাবে পাবেন তা লিঙ্কগুলি আকর্ষণীয় হতে পারে। ভিউতে ভিডমোডেলের রেফারেন্স কীভাবে পাবেন? এবং আমি কীভাবে ডেটাকনটেক্সট সম্পত্তি ব্যবহার করে এক্সএএমএল একটি উইন্ডোতে একটি ভিউমোডেল সেট করব ... ভিউমোডেলে কীভাবে একটি সাধারণ উইন্ডো সমাপ্তির ইভেন্টটি পরিচালনা করা যায় তা আমাকে কয়েক ঘন্টা সময় নিয়েছিল।
মার্কাসেগেল

18
এই সমাধানটি এমভিভিএম পরিবেশে অপ্রাসঙ্গিক। পিছনের কোডটি ভিউমোডেল সম্পর্কে জানা উচিত নয়।
জ্যাকব

2
@ জ্যাকব আমি মনে করি সমস্যাটি আরও বেশি যে আপনি আপনার ভিউমোডেলে একটি ফর্ম ইভেন্ট হ্যান্ডলার পেয়েছেন, যা ভিউমোডেলটিকে একটি নির্দিষ্ট ইউআই প্রয়োগের সাথে জুড়ে দেয়। যদি তারা পিছনে কোড ব্যবহার করতে চলেছে তবে তাদের CanExecute চেক করা উচিত এবং তারপরে আইকোমন্ড সম্পত্তিতে এক্সিকিউট () কল করা উচিত।
এভিল পায়রা

14
@ জ্যাকব কোড-পেছনটি ভিউমোডেল সদস্যদের সম্পর্কে ঠিক জরিমানা জানতে পারে, কেবলমাত্র এক্সএএমএল কোড করে। অথবা আপনি যখন ভিউমোডেল সম্পত্তিটিতে বাইন্ডিং তৈরি করেন তখন আপনি কী করছেন বলে মনে করেন? এই সমাধানটি এমভিভিএমের পক্ষে পুরোপুরি ঠিক আছে, যতক্ষণ না আপনি কোড-পেছনে নিজেই ক্লোজিং লজিকটি পরিচালনা করেন না, তবে ভিউমোডেলে (যদিও আইভোমন্ড ব্যবহার করে যেমন এভিলপিগেন পরামর্শ দেন, আপনিও বাঁধাই করতে পারেন বলে একটি ভাল ধারণা হতে পারে এতে)
almulo

81

এই কোডটি ঠিক কাজ করে:

ViewModel.cs:

public ICommand WindowClosing
{
    get
    {
        return new RelayCommand<CancelEventArgs>(
            (args) =>{
                     });
    }
}

এবং এক্সএএমএল-তে:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Closing">
        <command:EventToCommand Command="{Binding WindowClosing}" PassEventArgsToCommand="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>

ধরে নিচ্ছি যে:

  • ভিউমোডেল মূল ধারকগুলির একটিতে নির্ধারিত হয় DataContext
  • xmlns:command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.SL5"
  • xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

1
ভুলে গেছেন: কমান্ডে ইভেন্টের যুক্তি পেতে PassEventArgsToCommand = "সত্য"
স্টাস

2
+1 সহজ এবং প্রচলিত পদ্ধতির। PRISM এর দিকে যেতে আরও ভাল হবে।
ত্রি কিউ ট্রান

16
এটি এমন একটি দৃশ্য যা ডাব্লুপিএফ এবং এমভিভিএমের ফাঁক গর্তগুলিকে হাইলাইট করে।
ড্যামিয়েন

1
এটা সত্যিই কি উল্লেখ করতে সহায়ক হবে iমধ্যে <i:Interaction.Triggers>এবং কিভাবে এটি পেতে।
অ্যান্ড্রি মুজিচুক

1
@ চিজ, এটি এমন একটি নেমস্পেস যা আপনার মূল মূল উপাদান হিসাবে প্রকাশ করা উচিত: xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
স্টাস

34

এই বিকল্পটি আরও সহজ এবং সম্ভবত এটি আপনার পক্ষে উপযুক্ত। আপনার ভিউ মডেল কনস্ট্রাক্টরটিতে, আপনি মূল উইন্ডো সমাপ্তির ইভেন্টটিকে এভাবে গ্রাহক করতে পারেন:

Application.Current.MainWindow.Closing += new CancelEventHandler(MainWindow_Closing);

void MainWindow_Closing(object sender, CancelEventArgs e)
{
            //Your code to handle the event
}

শুভকামনা.


এই ইস্যুতে উল্লিখিত অন্যান্যদের মধ্যে এটিই সেরা সমাধান। ধন্যবাদ !
জ্যাকব

এই আমি খুঁজছিলাম ছিল। ধন্যবাদ!
নিকি পাঞ্জাবী

20
... এবং এটি ভিউমোডেল এবং ভিউয়ের মধ্যে দৃ tight় সংযোগ তৈরি করে। -1।
পিয়োটার্ক

6
এটি সেরা উত্তর নয়। এটি এমভিভিএম ব্রেক করে।
সাফিরন

1
@ ক্রেইগ এটির জন্য মূল উইন্ডোতে বা যে কোনও উইন্ডোটির জন্য ব্যবহার করা হচ্ছে তার জন্য কঠোর উল্লেখ দরকার। এটি অনেক সহজ, তবে এর অর্থ ভিউ মডেলটি ডিকম্পল হয়নি। এটি এমভিভিএম নার্দের সন্তুষ্ট করার প্রশ্ন নয় বা না, তবে যদি কাজটি চালানোর জন্য যদি এমভিভিএম প্যাটার্নটি ভেঙে ফেলা হয় তবে এটিকে ব্যবহার করার কোনও মানে নেই।
অ্যালেক্স

16

ভিভিমোডেলে উইন্ডো (বা এর কোনও ইভেন্ট) সম্পর্কে জানতে না চাইলে এখানে এমভিভিএম-প্যাটার্ন অনুসারে একটি উত্তর দেওয়া হয়েছে।

public interface IClosing
{
    /// <summary>
    /// Executes when window is closing
    /// </summary>
    /// <returns>Whether the windows should be closed by the caller</returns>
    bool OnClosing();
}

ভিউমোডেলে ইন্টারফেস এবং বাস্তবায়ন যুক্ত করুন

public bool OnClosing()
{
    bool close = true;

    //Ask whether to save changes och cancel etc
    //close = false; //If you want to cancel close

    return close;
}

উইন্ডোতে আমি সমাপ্ত ইভেন্টটি যুক্ত করি। পিছনে এই কোডটি এমভিভিএম প্যাটার্নটি ভঙ্গ করে না। ভিউ মডেল সম্পর্কে জানতে পারে!

void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    IClosing context = DataContext as IClosing;
    if (context != null)
    {
        e.Cancel = !context.OnClosing();
    }
}

সহজ, পরিষ্কার এবং পরিষ্কার। ভিউমোডেলটির ভিউটির সুনির্দিষ্ট জানতে হবে না, তাই উদ্বেগ পৃথক থেকে যায়।
বার্নহার্ড হিলার

প্রসঙ্গ সবসময় নাল!
শহীদ ওড

@ শাহিদঅড আপনার ভিউমোডেলকে IClosingকেবল OnClosingপদ্ধতিটি প্রয়োগ না করে ইন্টারফেসটি প্রয়োগ করা দরকার needs অন্যথায় DataContext as IClosingcastালাই ব্যর্থ হয়ে ফিরে আসবেnull
এরিক হোয়াইট

10

গীজ, মনে হচ্ছে এখানে প্রচুর কোড চলছে। উপরের স্টাসের ন্যূনতম প্রচেষ্টার জন্য সঠিক পদ্ধতি ছিল। (MVVMLight ব্যবহার কিন্তু স্বীকৃত হওয়া উচিত) এখানে আমার অভিযোজন হচ্ছে ... ওহ এবং PassEventArgsToCommand = "true" হয় স্পষ্টভাবে উপরের হিসাবে উল্লিখিত প্রয়োজন ছিল।

(লরেন্ট Bugnion কৃতিত্ব http://blog.galasoft.ch/archive/2009/10/18/clean-shutdown-in-silverlight-and-wpf-applications.aspx )

   ... MainWindow Xaml
   ...
   WindowStyle="ThreeDBorderWindow" 
    WindowStartupLocation="Manual">



<i:Interaction.Triggers>
    <i:EventTrigger EventName="Closing">
        <cmd:EventToCommand Command="{Binding WindowClosingCommand}" PassEventArgsToCommand="True" />
    </i:EventTrigger>
</i:Interaction.Triggers> 

ভিউ মডেলে:

///<summary>
///  public RelayCommand<CancelEventArgs> WindowClosingCommand
///</summary>
public RelayCommand<CancelEventArgs> WindowClosingCommand { get; private set; }
 ...
 ...
 ...
        // Window Closing
        WindowClosingCommand = new RelayCommand<CancelEventArgs>((args) =>
                                                                      {
                                                                          ShutdownService.MainWindowClosing(args);
                                                                      },
                                                                      (args) => CanShutdown);

শাটডাউন সার্ভিসে

    /// <summary>
    ///   ask the application to shutdown
    /// </summary>
    public static void MainWindowClosing(CancelEventArgs e)
    {
        e.Cancel = true;  /// CANCEL THE CLOSE - let the shutdown service decide what to do with the shutdown request
        RequestShutdown();
    }

অনুরোধশুটডাউন নীচের মতো কিছু দেখায় তবে মূলতঃ রিকুয়েস্টশুটডাউন বা যা নামকরণ করা হয় তা অ্যাপ্লিকেশনটি শাটডাউন করবেন কি না (যেভাবেই উইন্ডো বন্ধ করে দেওয়া হবে) সিদ্ধান্ত নেয়:

...
...
...
    /// <summary>
    ///   ask the application to shutdown
    /// </summary>
    public static void RequestShutdown()
    {

        // Unless one of the listeners aborted the shutdown, we proceed.  If they abort the shutdown, they are responsible for restarting it too.

        var shouldAbortShutdown = false;
        Logger.InfoFormat("Application starting shutdown at {0}...", DateTime.Now);
        var msg = new NotificationMessageAction<bool>(
            Notifications.ConfirmShutdown,
            shouldAbort => shouldAbortShutdown |= shouldAbort);

        // recipients should answer either true or false with msg.execute(true) etc.

        Messenger.Default.Send(msg, Notifications.ConfirmShutdown);

        if (!shouldAbortShutdown)
        {
            // This time it is for real
            Messenger.Default.Send(new NotificationMessage(Notifications.NotifyShutdown),
                                   Notifications.NotifyShutdown);
            Logger.InfoFormat("Application has shutdown at {0}", DateTime.Now);
            Application.Current.Shutdown();
        }
        else
            Logger.InfoFormat("Application shutdown aborted at {0}", DateTime.Now);
    }
    }

8

প্রশ্নকারীর স্টাএস উত্তরটি ব্যবহার করা উচিত, তবে যে পাঠকরা প্রিজম ব্যবহার করেন এবং কোন গ্যালসফট / এমভিভিএমলাইট ব্যবহার করেন না, তারা আমার কী ব্যবহার করেছেন তা চেষ্টা করতে পারেন:

উইন্ডো বা ব্যবহারকারীকন্ট্রোল ইত্যাদির শীর্ষে সংজ্ঞা অনুসারে নেমস্পেসের সংজ্ঞা দিন:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

এবং এই সংজ্ঞা ঠিক নীচে:

<i:Interaction.Triggers>
        <i:EventTrigger EventName="Closing">
            <i:InvokeCommandAction Command="{Binding WindowClosing}" CommandParameter="{Binding}" />
        </i:EventTrigger>
</i:Interaction.Triggers>

আপনার ভিউ মডেলটিতে সম্পত্তি:

public ICommand WindowClosing { get; private set; }

আপনার ভিউ মডেল কনস্ট্রাক্টরে ডেলিগেট কম্যান্ড সংযুক্ত করুন:

this.WindowClosing = new DelegateCommand<object>(this.OnWindowClosing);

অবশেষে, আপনার কোডটি আপনি নিয়ন্ত্রণ / উইন্ডো / যাই হোক না কেন কাছে পৌঁছাতে চান:

private void OnWindowClosing(object obj)
        {
            //put code here
        }

3
এটি বাতিল হওয়া ইভেন্টগুলি অ্যাক্সেস দেয় না যা বন্ধ হওয়ার ইভেন্টটি বাতিল করতে প্রয়োজনীয় cancel পাস করা অবজেক্টটি হ'ল ভিউ মডেল, যা প্রযুক্তিগতভাবে একই ভিউ মডেল যা উইন্ডো ক্লসিং কমান্ড কার্যকর করা হচ্ছে।
স্টিফেনবায়ের

4

আমি আপনার App.xaml.cs ফাইলের মধ্যে এমন একটি ইভেন্ট হ্যান্ডলার ব্যবহার করতে প্রলুব্ধ হব যা আপনাকে অ্যাপ্লিকেশনটি বন্ধ করতে হবে কিনা তা সিদ্ধান্ত নিতে দেয়।

উদাহরণস্বরূপ আপনার অ্যাপ্লিকেশন xaml.cs ফাইলে নিম্নলিখিত কোডের মতো কিছু থাকতে পারে:

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    // Create the ViewModel to attach the window to
    MainWindow window = new MainWindow();
    var viewModel = new MainWindowViewModel();

    // Create the handler that will allow the window to close when the viewModel asks.
    EventHandler handler = null;
    handler = delegate
    {
        //***Code here to decide on closing the application****
        //***returns resultClose which is true if we want to close***
        if(resultClose == true)
        {
            viewModel.RequestClose -= handler;
            window.Close();
        }
    }
    viewModel.RequestClose += handler;

    window.DataContaxt = viewModel;

    window.Show();

}

তারপরে আপনার মেইন উইন্ডোভিউ মডেল কোডের মধ্যে আপনার নিম্নলিখিতগুলি থাকতে পারে:

#region Fields
RelayCommand closeCommand;
#endregion

#region CloseCommand
/// <summary>
/// Returns the command that, when invoked, attempts
/// to remove this workspace from the user interface.
/// </summary>
public ICommand CloseCommand
{
    get
    {
        if (closeCommand == null)
            closeCommand = new RelayCommand(param => this.OnRequestClose());

        return closeCommand;
    }
}
#endregion // CloseCommand

#region RequestClose [event]

/// <summary>
/// Raised when this workspace should be removed from the UI.
/// </summary>
public event EventHandler RequestClose;

/// <summary>
/// If requested to close and a RequestClose delegate has been set then call it.
/// </summary>
void OnRequestClose()
{
    EventHandler handler = this.RequestClose;
    if (handler != null)
    {
        handler(this, EventArgs.Empty);
    }
}

#endregion // RequestClose [event]

1
বিস্তারিত উত্তর দেওয়ার জন্য ধন্যবাদ। তবে, আমি মনে করি না যে এটি আমার সমস্যার সমাধান করে: যখন ব্যবহারকারী উপরের ডান 'এক্স' বোতামটি ক্লিক করেন তখন আমাকে উইন্ডোটি বন্ধ হওয়া পরিচালনা করতে হবে। কোড-ব্যাকডে এটি করা সহজ হবে (আমি কেবল ক্লোজিং ইভেন্টটি যুক্ত করব এবং বাতিল করা ইভেন্টসকে বাতিল করে দেব C বিভ্রান্তির জন্য দুঃখিত
অলিভিয়ার পায়েেন

1

মূলত, উইন্ডো ইভেন্টটি এমভিভিএমকে বরাদ্দ করা হতে পারে না। সাধারণভাবে, ক্লোজ বোতামটি ব্যবহারকারীকে "সংরক্ষণ করুন: হ্যাঁ / না / বাতিল" জিজ্ঞাসা করার জন্য একটি ডায়ালগ বক্স দেখায় এবং এটি এমভিভিএম দ্বারা অর্জন করা যায় না।

আপনি অনক্লোজিং ইভেন্ট হ্যান্ডলারটি রাখতে পারেন, যেখানে আপনি মডেলকে কল করুন lo ক্লস.কেনেক্সেকিউট () এবং ইভেন্টের বৈশিষ্ট্যে বুলিয়ান ফলাফল সেট করুন। সুতরাং CanExecute () কলটি সত্য হলে, বা অনক্লুড ইভেন্টে, মডেলকে কল করুন lo ক্লোজ.এক্সেকিউট ()


1

আমি এটির সাথে খুব বেশি টেস্টিং করি নি তবে মনে হয় এটি কাজ করে। আমি এখানে যা এলাম তা এখানে:

namespace OrtzIRC.WPF
{
    using System;
    using System.Windows;
    using OrtzIRC.WPF.ViewModels;

    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        private MainViewModel viewModel = new MainViewModel();
        private MainWindow window = new MainWindow();

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            viewModel.RequestClose += ViewModelRequestClose;

            window.DataContext = viewModel;
            window.Closing += Window_Closing;
            window.Show();
        }

        private void ViewModelRequestClose(object sender, EventArgs e)
        {
            viewModel.RequestClose -= ViewModelRequestClose;
            window.Close();
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            window.Closing -= Window_Closing;
            viewModel.RequestClose -= ViewModelRequestClose; //Otherwise Close gets called again
            viewModel.CloseCommand.Execute(null);
        }
    }
}

1
ভিএম যেখানে ক্লোজিং বাতিল করতে চায় সেখানে এমন দৃশ্যে এখানে কী ঘটবে?
ত্রি কিউ ট্রান

1

আমরা এটির জন্য সংযুক্ত কম্যান্ডবিহার ব্যবহার করি। পেছনের কোনও কোড এড়ানো আপনার ভিউ মডেলের কোনও কমান্ডের সাথে আপনি কোনও ইভেন্ট সংযুক্ত করতে পারেন।

আমরা আমাদের সমাধান জুড়ে এটি ব্যবহার করি এবং পিছনে প্রায় শূন্য কোড রয়েছে

http://marlongrech.wordpress.com/2008/12/13/attachedcommandbehavior-v2-aka-acb/


1

এমভিভিএম লাইট টুলকিট ব্যবহার করে:

ধারণা করা হচ্ছে ভিউ মডেলে একটি এক্সিট কমান্ড রয়েছে:

ICommand _exitCommand;
public ICommand ExitCommand
{
    get
    {
        if (_exitCommand == null)
            _exitCommand = new RelayCommand<object>(call => OnExit());
        return _exitCommand;
    }
}

void OnExit()
{
     var msg = new NotificationMessageAction<object>(this, "ExitApplication", (o) =>{});
     Messenger.Default.Send(msg);
}

এটি ভিউতে প্রাপ্ত হয়েছে:

Messenger.Default.Register<NotificationMessageAction<object>>(this, (m) => if (m.Notification == "ExitApplication")
{
     Application.Current.Shutdown();
});

অন্যদিকে , ভিউমোডেলের উদাহরণটি ব্যবহার করে আমি Closingইভেন্টটি পরিচালনা MainWindowকরি:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{ 
    if (((ViewModel.MainViewModel)DataContext).CancelBeforeClose())
        e.Cancel = true;
}

CancelBeforeClose বর্তমান দর্শন মডেলটির অবস্থা পরীক্ষা করে এবং যদি বন্ধ হওয়া বন্ধ করা উচিত তবে সত্যটি ফিরে আসে।

আশা করি এটি কাউকে সাহায্য করবে।


-2
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        MessageBox.Show("closing");
    }

হাই, কোডটি আপনার কোডটি বুঝতে সহায়তা করে বলে কোডের সাথে কিছুটা ব্যাখ্যা যোগ করুন। কোড কেবল উত্তরগুলি ভঙ্গ করে দেওয়া হয়
ভরগভ রাও

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