WPF MaterialDesign 对话框宿主
WPF MaterialDesign Dialog Host
我正在构建一个 WPF 应用程序,我想要自定义 MessageBox,但我看到这真的很乏味,我想到了使用 MaterialDesign 提供的 DialogHost。问题是我无法让它按照我想要的方式工作,所以让我描述一下当前的行为和想要的行为。
当前行为:
<materialDesign:ColorZone Grid.Column="1"
Grid.ColumnSpan="2"
Grid.Row="1"
Mode="Light"
Padding="16">
<DockPanel>
<materialDesign:DialogHost DockPanel.Dock="Right">
<Button x:Name="PowerButton"
ToolTip="{Binding PowerButtonToolTip, Source={StaticResource ResourceKey=ButtonsResources}}"
Style="{StaticResource MaterialDesignIconButton}"
Command="{x:Static materialDesign:DialogHost.OpenDialogCommand}">
<Button.CommandParameter>
<StackPanel>
<TextBlock Text="TODO" />
<StackPanel Orientation="Horizontal"
Margin="0, 20, 0, 10">
<Button Width="90"
Height="30"
Margin="10, 0, 0, 0"
Style="{StaticResource MaterialDesignOutlinedButton}"
Click="PowerButton_Click">
OK
</Button>
<Button Width="90"
Height="30"
Margin="10, 0, 10, 0"
Style="{StaticResource MaterialDesignOutlinedButton}"
Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}">
CANCEL
</Button>
</StackPanel>
</StackPanel>
</Button.CommandParameter>
<materialDesign:PackIcon Kind="Power" />
</Button>
</materialDesign:DialogHost>
<StackPanel Orientation="Horizontal">
<ToggleButton x:Name="MenuButton"
Style="{DynamicResource MaterialDesignHamburgerToggleButton}" />
<TextBlock VerticalAlignment="Center"
Margin="16 0 0 0"
Text="{Binding MainViewTitle, Source={StaticResource ResourceKey=ViewsResources}}">
</TextBlock>
</StackPanel>
</DockPanel>
</materialDesign:ColorZone>
发生的情况是,当我单击 PowerButton 时,DialogHost 出现了 Button.CommandParameter 中的结构。这个问题是 window 在对话打开时不会被“禁用”(变得有点黑且无法点击)。
我看到要实现此行为,我需要 DialogHost 中 window 的所有内容。但真的如此还是我误会了什么?他们的示例 (see link) 并不是很有用,因为背景中似乎还有其他东西 运行。此外,打开“最顶层对话主机”按钮的命令materialDesign:DialogHost.OpenDialogCommand 似乎仅限于我。
让我们尝试一些简单的东西,让您在第一时间尝试。
DialogHost由两大部分组成
- 首先,显示到您的 DialogHost 中的所有内容都必须放在一个块中(StackPanel、Grid、DockPanel...),这是您的 DialogHost 的内容。
- 第二部分更像是你的对话框的上下文,当你想显示它时必须在某个地方显示,另一个块(StackPanel,Grid,DockPanel ...),上下文是你的地方对话框将显示一次,il 将显示居中并使块的其余部分变暗。
现在你已经掌握了主要理论,让我们根据演示给出的示例和你的代码制作一个简单的示例。
<materialDesign:DialogHost HorizontalAlignment="Center" VerticalAlignment="Center">
<materialDesign:DialogHost.DialogContent>
<StackPanel Margin="16">
<!-- HERE GOES YOUR CONTENT -->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" >
<Button Style="{StaticResource MaterialDesignFlatButton}" IsDefault="True"
Margin="0 8 8 0" Command="materialDesign:DialogHost.CloseDialogCommand">
<Button.CommandParameter>
<system:Boolean>True</system:Boolean>
</Button.CommandParameter>
ACCEPT
</Button>
<Button Style="{StaticResource MaterialDesignFlatButton}"
IsCancel="True" Margin="0 8 8 0"
Command="materialDesign:DialogHost.CloseDialogCommand">
<Button.CommandParameter>
<system:Boolean>False</system:Boolean>
</Button.CommandParameter>
CANCEL
</Button>
</StackPanel>
</StackPanel>
</materialDesign:DialogHost.DialogContent>
<!-- START OF YOUR CONTEXT-->
<!-- END OF YOUR CONTEXT -->
</materialDesign:DialogHost>
所以现在你已经有了足够的基础,可以开始享受了。
还有一点,您的上下文需要足够大以显示您放置在 DialogHost 上的内容,这样您就不能将整个对话框放在一个按钮周围,最好让它围绕更大的东西,首先尝试你应该尝试在一个新页面上测试这个上下文:
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Button x:Name="PowerButton" ToolTip="{Binding PowerButtonToolTip, Source={StaticResource ResourceKey=ButtonsResources}}"
Style="{StaticResource MaterialDesignIconButton}"
Command="{x:Static materialDesign:DialogHost.OpenDialogCommand}">
</Grid>
如果您想执行某个操作,内容下方的按钮就在那里,例如,如果 DialogHost 在那里用于修改或选择,用户可以说是或否,然后根据需要重命名 ACCEPT 和 CANCEL . “IsDefault”是为了让这个按钮在用户按下 Enter 时被视为已按下。按下一个按钮会自动关闭对话框,这是很好知道的。
由于 ACCEPT 和 CANCEL 都是按钮,您可以影响 Click 事件,这对于 DialogHost 的高级使用非常有用。
我正在构建一个 WPF 应用程序,我想要自定义 MessageBox,但我看到这真的很乏味,我想到了使用 MaterialDesign 提供的 DialogHost。问题是我无法让它按照我想要的方式工作,所以让我描述一下当前的行为和想要的行为。
当前行为:
<materialDesign:ColorZone Grid.Column="1"
Grid.ColumnSpan="2"
Grid.Row="1"
Mode="Light"
Padding="16">
<DockPanel>
<materialDesign:DialogHost DockPanel.Dock="Right">
<Button x:Name="PowerButton"
ToolTip="{Binding PowerButtonToolTip, Source={StaticResource ResourceKey=ButtonsResources}}"
Style="{StaticResource MaterialDesignIconButton}"
Command="{x:Static materialDesign:DialogHost.OpenDialogCommand}">
<Button.CommandParameter>
<StackPanel>
<TextBlock Text="TODO" />
<StackPanel Orientation="Horizontal"
Margin="0, 20, 0, 10">
<Button Width="90"
Height="30"
Margin="10, 0, 0, 0"
Style="{StaticResource MaterialDesignOutlinedButton}"
Click="PowerButton_Click">
OK
</Button>
<Button Width="90"
Height="30"
Margin="10, 0, 10, 0"
Style="{StaticResource MaterialDesignOutlinedButton}"
Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}">
CANCEL
</Button>
</StackPanel>
</StackPanel>
</Button.CommandParameter>
<materialDesign:PackIcon Kind="Power" />
</Button>
</materialDesign:DialogHost>
<StackPanel Orientation="Horizontal">
<ToggleButton x:Name="MenuButton"
Style="{DynamicResource MaterialDesignHamburgerToggleButton}" />
<TextBlock VerticalAlignment="Center"
Margin="16 0 0 0"
Text="{Binding MainViewTitle, Source={StaticResource ResourceKey=ViewsResources}}">
</TextBlock>
</StackPanel>
</DockPanel>
</materialDesign:ColorZone>
发生的情况是,当我单击 PowerButton 时,DialogHost 出现了 Button.CommandParameter 中的结构。这个问题是 window 在对话打开时不会被“禁用”(变得有点黑且无法点击)。
我看到要实现此行为,我需要 DialogHost 中 window 的所有内容。但真的如此还是我误会了什么?他们的示例 (see link) 并不是很有用,因为背景中似乎还有其他东西 运行。此外,打开“最顶层对话主机”按钮的命令materialDesign:DialogHost.OpenDialogCommand 似乎仅限于我。
让我们尝试一些简单的东西,让您在第一时间尝试。
DialogHost由两大部分组成
- 首先,显示到您的 DialogHost 中的所有内容都必须放在一个块中(StackPanel、Grid、DockPanel...),这是您的 DialogHost 的内容。
- 第二部分更像是你的对话框的上下文,当你想显示它时必须在某个地方显示,另一个块(StackPanel,Grid,DockPanel ...),上下文是你的地方对话框将显示一次,il 将显示居中并使块的其余部分变暗。
现在你已经掌握了主要理论,让我们根据演示给出的示例和你的代码制作一个简单的示例。
<materialDesign:DialogHost HorizontalAlignment="Center" VerticalAlignment="Center">
<materialDesign:DialogHost.DialogContent>
<StackPanel Margin="16">
<!-- HERE GOES YOUR CONTENT -->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" >
<Button Style="{StaticResource MaterialDesignFlatButton}" IsDefault="True"
Margin="0 8 8 0" Command="materialDesign:DialogHost.CloseDialogCommand">
<Button.CommandParameter>
<system:Boolean>True</system:Boolean>
</Button.CommandParameter>
ACCEPT
</Button>
<Button Style="{StaticResource MaterialDesignFlatButton}"
IsCancel="True" Margin="0 8 8 0"
Command="materialDesign:DialogHost.CloseDialogCommand">
<Button.CommandParameter>
<system:Boolean>False</system:Boolean>
</Button.CommandParameter>
CANCEL
</Button>
</StackPanel>
</StackPanel>
</materialDesign:DialogHost.DialogContent>
<!-- START OF YOUR CONTEXT-->
<!-- END OF YOUR CONTEXT -->
</materialDesign:DialogHost>
所以现在你已经有了足够的基础,可以开始享受了。
还有一点,您的上下文需要足够大以显示您放置在 DialogHost 上的内容,这样您就不能将整个对话框放在一个按钮周围,最好让它围绕更大的东西,首先尝试你应该尝试在一个新页面上测试这个上下文:
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Button x:Name="PowerButton" ToolTip="{Binding PowerButtonToolTip, Source={StaticResource ResourceKey=ButtonsResources}}"
Style="{StaticResource MaterialDesignIconButton}"
Command="{x:Static materialDesign:DialogHost.OpenDialogCommand}">
</Grid>
如果您想执行某个操作,内容下方的按钮就在那里,例如,如果 DialogHost 在那里用于修改或选择,用户可以说是或否,然后根据需要重命名 ACCEPT 和 CANCEL . “IsDefault”是为了让这个按钮在用户按下 Enter 时被视为已按下。按下一个按钮会自动关闭对话框,这是很好知道的。 由于 ACCEPT 和 CANCEL 都是按钮,您可以影响 Click 事件,这对于 DialogHost 的高级使用非常有用。