我想使用WPF Prism + MahApps.Metro创建一个弹出窗口或对话框,其中包含选择确认(确定,取消)。
我创建了自定义交互:
<i:Interaction.Triggers>
<interactionRequest:InteractionRequestTrigger SourceObject="{Binding DeleteConfirmationRequest, Mode=OneWay}">
<interactionRequest:PopupWindowAction>
<interactionRequest:PopupWindowAction.WindowContent>
<confirmation:ConfirmationDialog/>
</interactionRequest:PopupWindowAction.WindowContent>
</interactionRequest:PopupWindowAction>
</interactionRequest:InteractionRequestTrigger>
</i:Interaction.Triggers>
但这将创建一个默认的WPF窗口,该窗口不是Metro风格的。如何将其更改为MahApps.Metro窗口?
也许,另一种方法是使用MahApps.Metro对话框,但是我不知道如何将其与Prism一起使用。
有任何想法吗?
最佳答案
您必须做两件事,创建新的MetroWindow对话框,然后重写PopupWindowAction以使用它们。听起来很长,但只需要10分钟:
因此,首先,创建您自己的从MetroWindow继承的确认和通知窗口,就像其他任何MetroWindow一样。您可以从 Prism 源复制原始的确认和通知窗口,并按照mahapps quick start的建议进行更改。
因此,“确认”窗口将类似于:
<Controls:MetroWindow x:Class="MyApp.DefaultPopupWindows.DefaultConfirmationWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
MinWidth="300" MinHeight="150"
Title="{Binding Title}"
BorderBrush="{DynamicResource AccentColorBrush}"
BorderThickness="1">
<Grid x:Name="LayoutRoot" Margin="5">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ContentControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0" Content="{Binding Content}"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
<Button x:Name="OkButton" Content="OK" Width="75" Height="25" HorizontalAlignment="Right" Margin="0,10,0,0" Click="OkButton_Click" />
<Button x:Name="CancelButton" Content="Cancel" Width="75" Height="25" HorizontalAlignment="Right" Margin="20,10,0,0" Click="CancelButton_Click" />
</StackPanel>
</Grid>
</Controls:MetroWindow>
以及后面的关联代码:
using MahApps.Metro.Controls;
using Microsoft.Practices.Prism.Interactivity.InteractionRequest;
using System.Windows;
namespace MyApp.DefaultPopupWindows
{
/// <summary>
/// Interaction logic for ConfirmationChildWindow.xaml
/// </summary>
public partial class DefaultConfirmationWindow : MetroWindow
{
/// <summary>
/// Creates a new instance of ConfirmationChildWindow.
/// </summary>
public DefaultConfirmationWindow()
{
InitializeComponent();
}
/// <summary>
/// Sets or gets the <see cref="IConfirmation"/> shown by this window./>
/// </summary>
public IConfirmation Confirmation
{
get
{
return this.DataContext as IConfirmation;
}
set
{
this.DataContext = value;
}
}
private void OkButton_Click(object sender, RoutedEventArgs e)
{
this.Confirmation.Confirmed = true;
this.Close();
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
this.Confirmation.Confirmed = false;
this.Close();
}
}
}
接下来,您将创建自己的PopupWindowAction,将其扩展为棱柱形。在该类中,您重写GetWindow函数:
protected override Window GetWindow(INotification notification)
{
MetroWindow wrapperWindow;
if (this.WindowContent != null)
{
wrapperWindow = new MetroWindow();
// If the WindowContent does not have its own DataContext, it will inherit this one.
wrapperWindow.DataContext = notification;
wrapperWindow.Title = notification.Title;
this.PrepareContentForWindow(notification, wrapperWindow);
}
else
{
wrapperWindow = this.CreateDefaultWindow(notification);
}
return wrapperWindow;
}
您还必须为“CreateDefaultWindow”提供自己的实现,该实现将创建相应窗口的新MetroWindow版本:
protected new MetroWindow CreateDefaultWindow(INotification notification)
{
MetroWindow window = null;
if (notification is IConfirmation)
{
window = new DefaultPopupWindows.DefaultConfirmationWindow() { Confirmation = (IConfirmation)notification };
}
else
{
window = new DefaultPopupWindows.DefaultNotificationWindow() { Notification = notification };
}
return window;
}
最后,在您自己的 View /窗口的InteractionRequest中,指定此新的PopupWindowAction,而不是 Prism 版本。
关于wpf - Prism InteractionRequest + MahApps.Metro,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30018969/