我有一個對話框,它回傳IListkey 的值CreatedGroups。
當用戶按下對話框上的某個按鈕將其關閉時,我已經可以回傳所述字串。
private void CloseDialogOK()
{
CanCloseDialog = true;
DialogParameters parm = new DialogParameters();
parm.Add("CreatedGroups", _createdGroups);
RequestClose?.Invoke(new DialogResult(ButtonResult.OK, parm));
}
但是,由于我無法洗掉位于對話框右上角的 [X] 關閉按鈕,如何將上述相同的方法附加到 [X] 關閉按鈕?
uj5u.com熱心網友回復:
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>
在這種情況下,您可以將Click事件處理程式添加到關閉Button或將命令系結到它以添加您的自定義行為。
使用默認視窗樣式但更改關閉按鈕的作業方式的另一個選項是創建一個自定義對話框視窗,該視窗將處理程式添加到Closed事件中。然后你可以把你的自定義行為放在那里。它將在DialogServicefrom Prism 處理事件之前被呼叫。
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表示對話框是通過關閉按鈕等外部機制關閉的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494714.html
