locked
איך לסגור חלון PopupChildWindowAction של Prism מתוך החלון עצמו? RRS feed

  • שאלה

  • היי,

    יש לי view שנפתח כChildWindow במנגנון של Prism בצורה הבאה:

    <i:Interaction.Triggers>
      <ir:InteractionRequestTrigger SourceObject="{Binding CreateUserStoryRequest}">
        <ir:PopupChildWindowAction>
          <ir:PopupChildWindowAction.ChildWindow>
            <view:CreateUserStory />
          </ir:PopupChildWindowAction.ChildWindow>
        </ir:PopupChildWindowAction>
      </ir:InteractionRequestTrigger>
    </i:Interaction.Triggers>
    

    השאלה שלי היא,

    איך אפשר מתוך החלון שנפתח (הView, שהוא בעצם סתם UserControll) לסגור את החלון עצמו. המשתמש יכול כמובן ללחוץ על ה"X" בצד וזה יסגור, אבל אני רוצה יכולת לסגור את החלון בעצמי מתוך החלון עצמו.

    תודה רבה!


    • נערך על-ידי Elad R Katz יום חמישי 19 יולי 2012 10:21 סידור קוד
    יום רביעי 18 יולי 2012 14:25

תשובות

  • הי

    יש לוודא שהניימספייס של interactivity נוסף ל UserControl, ולהשתמש ב ChangePropertyAction
    (או ב CallMethodAction כדי לקרוא ל Close של החלון המכיל)

    ובזאמלית:

    <UserControl....>
       <Button Content="close me">
          <i:Interactions.Triggers>
             <i:EventTrigger EventName=Click>
                <e:ChangePropertyAction PropertyName=DialogResult
    Value=True
    TargetObject= ”{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}”/>
             </i:EventTrigger>
    
          </i:Interactions.Triggers>
       </Button>
    </UserControl>
    
    
    

    (כתבתי בנוטפד, מקווה שהאינטרפרטר יאכל את זה)

    • הוצע כתשובה על-ידי Elad R Katz יום חמישי 19 יולי 2012 10:22
    • סומן כתשובה על-ידי LiranBri יום שישי 20 יולי 2012 12:12
    • סימון כתשובה בוטל על-ידי LiranBri יום שני 23 יולי 2012 12:18
    • סומן כתשובה על-ידי Eran Sharvit יום שלישי 31 יולי 2012 14:05
    יום רביעי 18 יולי 2012 19:07

כל התגובות

  • הי

    יש לוודא שהניימספייס של interactivity נוסף ל UserControl, ולהשתמש ב ChangePropertyAction
    (או ב CallMethodAction כדי לקרוא ל Close של החלון המכיל)

    ובזאמלית:

    <UserControl....>
       <Button Content="close me">
          <i:Interactions.Triggers>
             <i:EventTrigger EventName=Click>
                <e:ChangePropertyAction PropertyName=DialogResult
    Value=True
    TargetObject= ”{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}”/>
             </i:EventTrigger>
    
          </i:Interactions.Triggers>
       </Button>
    </UserControl>
    
    
    

    (כתבתי בנוטפד, מקווה שהאינטרפרטר יאכל את זה)

    • הוצע כתשובה על-ידי Elad R Katz יום חמישי 19 יולי 2012 10:22
    • סומן כתשובה על-ידי LiranBri יום שישי 20 יולי 2012 12:12
    • סימון כתשובה בוטל על-ידי LiranBri יום שני 23 יולי 2012 12:18
    • סומן כתשובה על-ידי Eran Sharvit יום שלישי 31 יולי 2012 14:05
    יום רביעי 18 יולי 2012 19:07
  • היי,

    אני אנסה את זה ביום ראשון, תודה!

    שאלה: איך הכי נכון יהיה לעשות את זה מתוך ה-VM? למשל, אני רוצה לעשות Button ששומר נתונים, ואחרי השמירה סוגר את החלון

    יום שישי 20 יולי 2012 12:14
  • לירן - זו כבר שאלה אחרת לחלוטין...
    במקרה כזה אתה רוצה לממש שירות שיודע לסגור את החלון ושה VM יקרא לו, ולא להשתמש ב behaviors.

    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt

    שבת 21 יולי 2012 15:38
  • היי,

    אי אפשר מתוך ה-VM לשנות איזה בוליאני שיפעיל טריגר בXAML?

    ובלי קשר, בנוגע לפתרון שהביאו לי דרך ה-XAML: לא הצלחתי ליישם אותו. הXAML לא מכיר  AncestorType כמאפיין של RelativeSource. יכול להיות שזה רלוונטי רק לWPF ולא לSilverLight?

    באופן כללי, לא ממש הצלחתי להבין מה קורה שם.. בCODE BEHIND כלל לא מצאתי מאפיין בשם DialogResult, אז מאיפה בעצם הוא מנסה להגיע אליו?

    תודה רבה !!

    יום שני 23 יולי 2012 08:12
  • 1. אכן אפשר, וזה פתרון סבבה.

    2. אאל"ט זה אכן חסר ב SL - פשוט תשתמש ב Binding מסוג ElementName שיכוון לחלון.

    3. DialogResult זה פרופרטי שהוא משנה על מנת לסגור את החלון. חלונות שהוצגו על ידי ShowDialog ב WPF יכולים להסגר ככה אאל"ט. בSL זה יתבצע שונה.. איזה חלונות יש לך באפליקציה? איך הם ממומשים?


    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt

    יום שני 23 יולי 2012 09:25
  • אני מתנצל שלא רשמתי מראש שמדובר בSL.. נראה שהתשובה שקיבלתי אם כך לא רלוונטית.

    אני אהיה עכשיו יותר מפורט לגבי איך הכל עובד.

    בXAML של חלון האב, יש לי הגדרה כזאת:

    <i:Interaction.Triggers>
      <ir:InteractionRequestTrigger SourceObject="{Binding ShowItemInfoInteraction}">
        <ir:PopupChildWindowAction>
          <ir:PopupChildWindowAction.ChildWindow>	
    	<sdk:ChildWindow Content={Binding Content}">
    		<sdk:ChildWindow.ContentTemplate>
    			<v:ItemInfo/>
    		</sdk:ChildWindow.ContentTemplate>
    	</sdk:ChildWindow>
     </ir:PopupChildWindowAction.ChildWindow>
        </ir:PopupChildWindowAction>
      </ir:InteractionRequestTrigger>
    </i:Interaction.Triggers>

    ובVM של חלון האב, יש לי:

    private InteractionRequest<Notificatiopn> _showInfo; public InteractionRequest<Notification> ShowInfoInteraction { get { if (_showInfo != null) _showInfo = new InteractionRequest<Notification>(); return _showInfo; } } public void ShowInfoEventHandler(ItemInfoVM detailsVM) { ShowInfoInteraction.Raise(new Notification() { Content = detailsVM } }

    בצורה כזאת, אני מעלה את החלון המשני, כאשר דרך Content אני נותן VM שהוא אובייקט שמכיל את מה שהחלון בן צריך כדי להציג.

    ItemInfo הוא ה XAML של החלון בן.

    מקווה שזה מובן.. העתקתי הכל ממסך למסך (אני עובד ברשת סגורה ולכן אין COPY PASTE)

    תודה

    יום שני 23 יולי 2012 12:33
  • התשובה שקיבלת כן רלוונטית, עם התאמות קלות סה"כ.

    במקום DialogWindow יש לך ChildWindow. כל מה שאתה צריך לעשות בשביל להתאים זה לא להשתמש ב DialogResult - ולסגור את החלון בצורה מפורשת מתוך ה Behavior.


    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt

    יום שני 30 יולי 2012 11:11