【问题标题】:Closing Material Design DialogHost from Code从代码中关闭 Material Design DialogHost
【发布时间】:2018-06-01 23:24:21
【问题描述】:

我正在尝试找到一种方法来从代码中启动关闭活动的 DialogHost,但一直找不到正确的语法。我认为主要挑战是从后面的 MainWindow 代码之外的类访问 DialogHost。

我的整个 XAML:

<Window x:Class="MaterialDesignTest.MainWindow"
    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:local="clr-namespace:MaterialDesignTest"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525"
    xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
    TextElement.Foreground="{DynamicResource MaterialDesignBody}"
    TextElement.FontWeight="Regular"
    TextElement.FontSize="13"
    TextOptions.TextFormattingMode="Ideal" 
    TextOptions.TextRenderingMode="Auto"        
    Background="{DynamicResource MaterialDesignPaper}"
    FontFamily="{DynamicResource MaterialDesignFont}">

<materialDesign:DialogHost Identifier="RootDialog" Loaded="DialogHost_Loaded">
    <Grid>
        <StackPanel>
            <Button Width="100" x:Name="SearchRestore" Margin="0 150 0 0" Command="{x:Static materialDesign:DialogHost.OpenDialogCommand}" materialDesign:DialogHost.DialogClosingAttached="SearchRestore_OnDialogClosing" 
                Content="Restore" Click="SearchRestore_Click">
                <Button.CommandParameter>
                        <StackPanel Margin="10">
                            <TextBlock Text="Restoring..."/>
                        <Button Name="CircleButton" Margin="0 50 0 0" Style="{StaticResource MaterialDesignFloatingActionButton}"
                        Command="{Binding SaveComand}" IsHitTestVisible="False"
                        materialDesign:ButtonProgressAssist.IsIndicatorVisible="{Binding IsSaving}"
                        materialDesign:ButtonProgressAssist.Value="{Binding SaveProgressButton}">
                            <materialDesign:PackIcon Height="24" Width="24" Foreground="White">
                                <materialDesign:PackIcon.Style>
                                    <Style TargetType="materialDesign:PackIcon" BasedOn="{StaticResource {x:Type materialDesign:PackIcon}}">
                                        <Setter Property="Kind" Value="CloudSync" />
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding IsSaveComplete}" Value="True">
                                                <Setter Property="Kind" Value="Check" />
                                                <DataTrigger.EnterActions>
                                                    <BeginStoryboard>
                                                        <Storyboard>
                                                            <DoubleAnimation Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:0.8" />
                                                        </Storyboard>
                                                    </BeginStoryboard>
                                                </DataTrigger.EnterActions>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </materialDesign:PackIcon.Style>
                            </materialDesign:PackIcon>
                        </Button>
                    </StackPanel>
                </Button.CommandParameter>
            </Button>
        </StackPanel>
    </Grid>
</materialDesign:DialogHost>

以及我需要启动关闭的代码(这是在视图模型中,而不是后面的 MainWindow 代码):

     private async void progressTimerTick(object sender, EventArgs e)
    {

        if (progress < 100 && cycles < 2)
        {
            if (progress == 99)
            {
                cycles++;
                progress = 0;
            }

            IsSaveComplete = false;
            IsSaving = true;
            progress++;
            SaveProgressButton = progress;
        }
        else
        {
            IsSaveComplete = true;
            IsSaving = false;
            progressTimer.Enabled = false;
            SaveProgressButton = 0;

            await PutTaskDelay();

            //Close dialog here
        }
    }

【问题讨论】:

    标签: c# wpf xaml material-design-in-xaml


    【解决方案1】:

    在 MDIX 中有 3 种方法可以关闭对话框:

    var dialogResult = await DialogHost.Show(myDialogControl, (sender, args) =>
    {
        args.Session.Close(false);
    });
    

    或

    DialogHost.CloseDialogCommand.Execute(null,null);
    

    或

    DialogHostInstance.IsOpen = false;
    

    【讨论】:

    • 谢谢! DialogHost.CloseDialogCommand.Execute(null, null);最适合我的目的。
    • 对不起,这三种方法中的哪一种?
    【解决方案2】:

    关于@Talha 的回答。

    我已经尝试过您的解决方案,但是没有用。另一方面,我找到了解决方法:

    var drawer = DrawerHost.CloseDrawerCommand; 
    drawer.Execute(null, null); 
    

    看起来一样,但对我有用。

    【讨论】:

    • 问题是关于 DialogHost 而不是 DrawerHost。 Talha 的答案适用于 DialogHost,因为这是 OP 所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多