打开

时间:2017-01-21 15:18:59

标签: c# wpf xaml material-design mahapps.metro

我正在使用MaterialDesignThemes nuget包以及Mahapps.Metro包

我有这个DialogHost

<material:DialogHost Name="PopupAddCustom" HorizontalAlignment="Center" VerticalAlignment="Center" IsOpen="False" >
    <material:DialogHost.DialogContent>
        <StackPanel Margin="16" Orientation="Vertical">
            <Label Content="Add custom date" FontSize="16" />
            <DatePicker />
            <StackPanel Orientation="Horizontal">
                <Button Content="ACCEPT" Style="{DynamicResource MaterialDesignFlatButton}" IsDefault="True" Margin="0,8,8,0" Command="material:DialogHost.CloseDialogCommand" CommandParameter="True" />
                <Button Content="CANCEL" Style="{DynamicResource MaterialDesignFlatButton}" IsCancel="True" Margin="0,8,8,0" Command="material:DialogHost.CloseDialogCommand" CommandParameter="False" />
            </StackPanel>
        </StackPanel>
    </material:DialogHost.DialogContent>
</material:DialogHost>

这个按钮正在打开

<Button MinWidth="120" Margin="10" Style="{StaticResource MaterialDesignRaisedAccentButton}" ToolTip="Add in a new custom date." Command="{x:Static material:DialogHost.OpenDialogCommand}" CommandTarget="{Binding ElementName=PopupAddCustom}"  >
    <StackPanel Orientation="Horizontal">
        <Rectangle Width="20" Height="20" Fill="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=Foreground}">
            <Rectangle.OpacityMask>
                <VisualBrush Stretch="Fill" Visual="{StaticResource fa_plus}" />
            </Rectangle.OpacityMask>
        </Rectangle>
        <TextBlock Margin="10,0,0,0" VerticalAlignment="Center" Text="Custom" />
    </StackPanel>
</Button>

然而,当此对话框打开时,ACCEPT和CANCEL按钮被禁用。因此要检查是否有任何错误,我从我的MainWindow构造函数中手动打开此对话框,如此

this.Loaded += delegate(object sender, RoutedEventArgs args)
{
    this.PopupAddCustom.IsOpen = true;
};

当我打开这样的对话框按钮处于正常工作状态时,我是否遗漏了一些明显的东西?

2 个答案:

答案 0 :(得分:2)

通过为像这样的按钮设置命令目标来解决问题

 CommandTarget="{Binding ElementName=PopupAddCustom}"

答案 1 :(得分:0)

为了节省别人的时间:我将对话框内容指定为命令参数,并指定CommandTarget对我没有帮助。

在我的情况下,有用的是CommandParameter之前放置Command

您可以通过将内容作为资源传递来实现这一目标。

实施例

之前:

<Button 
   ... 
   Command="{x:Static material:DialogHost.OpenDialogCommand}"
   >
   <Button.CommandParameter>
       <Grid>
         ** Dialog content **
       </Grid>
   </Button.CommandParameter>
   ** Button content **
</Button>

后:

<UserControl.Resources>
  <Grid x:Key="MyDialogContent">
    ** Dialog content **
  </Grid>
</UserControl.Resources>

<Button 
   ... 
   CommandParameter="{StaticResource MyDialogContent}"
   Command="{x:Static material:DialogHost.OpenDialogCommand}"
   >
   ** Button content **
</Button>

并且对话框主机按钮不再被禁用。