Призма PopupChildWindowAction на рабочем столе DLL отсутствует

Я пытаюсь реализовать модальный диалог в приложении WPF Prism Desktop.

Из руководства Prism я могу видеть, что правильный способ должен использоваться взаимодействие:

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

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

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

Но PopupChildWindowAction недоступен в библиотеке Microsoft.Practices.Prism.Interactivity.DLL для рабочего стола, только Silverlight?

Я мог бы использовать Google для различных реализаций модального диалога в WPF (Prism), но просто интересно, почему эта функция отсутствует в DLL Prism Desktop и доступна в Silverlight DLL? Я мог бы использовать Interaction Service, но запрос на взаимодействие предлагается как более подходящий подход для приложения MVVM.

Ответ 1

Это правда, что он существует только в библиотеке призмы Silverlight,

Что вы можете сделать, это создать свой собственный.

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>

И если вам здесь нужен код для DialogWindow, он сам.

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>