Prism PopupChildWindowAction in Desktop DLL missing

前端 未结 2 614
忘掉有多难
忘掉有多难 2021-01-14 05:08

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:



        
相关标签:
2条回答
  • 2021-01-14 05:51

    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>
    

    0 讨论(0)
  • 2021-01-14 05:59

    Here is an example made in WPF:
    http://blogs.southworks.net/dcherubini/2012/05/24/popupwindowaction-using-custom-views-instead-of-windows-in-wpf-and-prism/

    0 讨论(0)
提交回复
热议问题