Prism PopupChildWindowAction in Desktop DLL missing
Asked Answered
S

2

3

I am trying to implement modal dialog in the WPF Prism Desktop application.

From Prism guidance I can see that proper way should be using Interaction:

<i:Interaction.Triggers>
    <prism:InteractionRequestTrigger 
            SourceObject="{Binding ConfirmCancelInteractionRequest}">

        <prism:PopupChildWindowAction
                  ContentTemplate="{StaticResource ConfirmWindowTemplate}"/>

    </prism:InteractionRequestTrigger>
</i:Interaction.Triggers>

But PopupChildWindowAction is not available in the Microsoft.Practices.Prism.Interactivity.DLL library for Desktop, only Silverlight?

I could google for many different implementations of the Modal Dialog in WPF (Prism), but just wondering why this feature is missing from Prism Desktop DLL and is available in Silverlight DLL? I could use Interaction Service but Interaction Request is suggested as more appropriate approach for MVVM application.

Spoil answered 3/9, 2013 at 15:35 Comment(0)
G
6

That's true it only exists in the Silverlight prism library ,

What you can do is create your own .

CS :

public class OpenPopupWindowAction : TriggerAction<FrameworkElement>
{     
    protected override void Invoke(object parameter)
    {           
        var popup = (ChildWindow)ServiceLocator.Current.GetInstance<IPopupDialogWindow>();
        popup.Owner = PlacementTarget ?? (Window)ServiceLocator.Current.GetInstance<IShell>();

        popup.DialogResultCommand = PopupDailogResultCommand;
        popup.Show();                      
    }

    public Window PlacementTarget
    {
        get { return (Window)GetValue(PlacementTargetProperty); }
        set { SetValue(PlacementTargetProperty, value); }
    }       

    public static readonly DependencyProperty PlacementTargetProperty =
        DependencyProperty.Register("PlacementTarget", typeof(Window), typeof(OpenPopupWindowAction), new PropertyMetadata(null));


    public ICommand PopupDailogResultCommand    
    {
        get { return (ICommand)GetValue(PopupDailogResultCommandProperty); }
        set { SetValue(PopupDailogResultCommandProperty, value); }
    }

    public static readonly DependencyProperty PopupDailogResultCommandProperty =
        DependencyProperty.Register("PopupDailogResultCommand", typeof(ICommand), typeof(OpenPopupWindowAction), new PropertyMetadata(null));        
}

XAML :

    <i:EventTrigger SourceObject="{Binding}" EventName="NavigatedFrom"> 
        <popup:OpenPopupWindowAction  PopupDailogResultCommand="{Binding OnNavigationConfirmed}"/>
    </i:EventTrigger>

And if you need here is the Code for the DialogWindow it self .

cs:

public partial class ChildWindow : Window, IPopupDialogWindow
{
    public ChildWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    public new PopupDialogResult DialogResult
    {
        get;
        set;
    }

    public System.Windows.Input.ICommand DialogResultCommand
    {
        get;
        set;
    }
}

xaml :

  <Window x:Class="Utils.ActionPopupWindow.ChildWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="300" Width="400" WindowStartupLocation="CenterOwner"
    xmlns:popup="clr-namespace:Utils.ActionPopupWindow"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    x:Name="popUpWindow"
    >

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="30"/>
    </Grid.RowDefinitions>
    <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="30">
        This is a child window <LineBreak/> launched from the <LineBreak/>main window
    </TextBlock>
    <StackPanel Grid.Row="1" Background="#FFA6A6A6">
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">

            <Button Content="Ok" 
                    MinWidth="100" 
                    Command="{Binding DialogResultCommand}" 
                    CommandParameter="{x:Static popup:PopupDialogResult.OK}"
                    >
                 <i:Interaction.Triggers>
                      <i:EventTrigger EventName="Click">
                         <ei:CallMethodAction MethodName="Close" TargetObject="{Binding ElementName=popUpWindow}"/>
                       </i:EventTrigger>
                  </i:Interaction.Triggers>
            </Button>

            <Button Content="Cancel" 
                    MinWidth="100"
                    Command="{Binding DialogResultCommand}" 
                    CommandParameter="{x:Static popup:PopupDialogResult.Cancel}"
                    >
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <ei:CallMethodAction MethodName="Close" TargetObject="{Binding ElementName=popUpWindow}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>           
        </StackPanel>             
    </StackPanel>

</Grid>

Gaultheria answered 3/9, 2013 at 15:44 Comment(2)
Thanks, I was planning to do similar thing but didn't want to reinvent wheel, was expecting that something like this already exists in Desktop DLL. I don't see the reason why is it only available in Silverlight DLL?Spoil
Not that i can see :) , besides there implementation is over complicated and relay on 2 very specific notification objects , all you wan't is a popup with a message ..Gaultheria

© 2022 - 2024 — McMap. All rights reserved.