我有一个对话框,它返回键CreatedGroups
的IList
值。
当用户按下对话框上的某个按钮关闭对话框时,我已经可以返回所述字符串。
private void CloseDialogOK()
{
CanCloseDialog = true;
DialogParameters parm = new DialogParameters();
parm.Add("CreatedGroups", _createdGroups);
RequestClose?.Invoke(new DialogResult(ButtonResult.OK, parm));
}
然而,我不能删除[X]关闭按钮位于对话框的右上角,我怎么能把相同的方法附加到[X]关闭按钮?
Prism有一个附加属性来设置对话框UserControl
标记中的对话框窗口的样式。在那里,您可以将WindowStyle
设置为None
以删除按钮和标题。
<UserControl ...>
<mvvm:Dialog.WindowStyle>
<Style TargetType="Window">
<Setter Property="WindowStyle" Value="None"/>
</Style>
</mvvm:Dialog.WindowStyle>
<!-- ...other markup. -->
</UserControl>
如果这不能满足您的要求,您将不得不创建一个自定义对话框窗口。
- 注册自定义对话框窗口
你可以自定义一切,甚至创建自己的按钮和标题栏,例如:
<Window x:Class="MCOSMOS.Infrastructure.Interactivity.Confirmations.ConfirmationWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
mc:Ignorable="d"
SizeToContent="WidthAndHeight"
WindowStartupLocation="CenterOwner">
<WindowChrome.WindowChrome>
<WindowChrome GlassFrameThickness="1"
CaptionHeight="0"
ResizeBorderThickness="1"
UseAeroCaptionButtons="False"
NonClientFrameEdges="Bottom"/>
</WindowChrome.WindowChrome>
<Window.Template>
<ControlTemplate TargetType="{x:Type Window}">
<DockPanel Background="White">
<Grid DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Text="{Binding Title, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
<Button Grid.Column="1"
Focusable="False"
Content="X">
</Button>
</Grid>
<ContentPresenter DockPanel.Dock="Bottom"/>
</DockPanel>
</ControlTemplate>
</Window.Template>
</Window>
在这种情况下,您可以为关闭Button
添加Click
事件处理程序,或者为其绑定命令以添加您的自定义行为。
使用默认窗口样式的另一个选择,但改变关闭按钮的工作方式是创建一个自定义对话框窗口,向Closed
事件添加处理程序。然后你可以把你的自定义行为放在那里。它将在Prism中的DialogService
处理事件之前被调用。
public partial class YourCustomDialogWindow : Window, IDialogWindow
{
public YourCustomDialogWindow()
{
InitializeComponent();
Closed += OnClosed;
}
public IDialogResult Result { get; set; }
private void OnClosed(object sender, EventArgs e)
{
// Check for null to make sure no other button caused closing.
if (DialogResult is null)
{
var dataContext = (YourDataContext)DataContext;
// ...do something, call a method and set a result.
}
}
}
一般来说,您可以提供自己的接口,使具有该机制的对话框可重用,而不是硬连接到单个数据上下文,而不是强制转换为具体的数据上下文类型。
另一个解决这个问题的通用方法是创建自己的DialogService
,方法是派生默认实现并更改关闭的处理方式。覆盖ConfigureDialogWindowEvents
方法,复制这里的默认实现并自定义closedHandler
,例如:
EventHandler closedHandler = null;
closedHandler = (o, e) =>
{
// ...
if (dialogWindow.Result == null)
dialogWindow.Result = // ...get and set your result.
// ...
};
dialogWindow.Closed += closedHandler;
请注意,这些方法假设所有其他关闭对话框的方法都将设置IDialogResult
,因此您可以确定null
的值意味着通过关闭按钮等外部机制关闭对话框。