微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WPF MaterialDesign对话框主机

如何解决WPF MaterialDesign对话框主机

我正在构建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,10">
                                    <Button Width="90"
                                            Height="30"
                                            Margin="10,0"
                                            Style="{StaticResource MaterialDesignOutlinedButton}"
                                            Click="PowerButton_Click">
                                        OK
                                    </Button>
                                    <Button Width="90"
                                            Height="30"
                                            Margin="10,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中的结构。这样做的问题是,对话框打开时,窗口不会“被禁用”(变得有点黑且不可点击)。

我看到要实现此行为,我需要DialogHost内窗口的所有内容。但是真的是这样吗?还是我误会了什么?他们的示例(see link)并没有真正的帮助,因为似乎还有其他事情在后台运行。此外,用于打开“最高对话主机”的按钮的命令materialDesign:DialogHost.OpenDialogCommand似乎仅限于我。

解决方法

让我们尝试一些简单的方法,让您第一次尝试。

DialogHost由两个主要部分组成

  • 首先,所有要显示在DialogHost中的东西,必须都放在一个块(StackPanel,Grid,DockPanel ...)中,这是DialogHost的内容。
  • 第二部分更像对话框的上下文,当您要显示它时,它必须在要显示的地方,另一个块(StackPanel,Grid,DockPanel ...),上下文是对话框将要放置的地方一旦显示出来,il将显示居中并使其余块变暗。

现在您已经掌握了主要理论,让我们根据演示给出的示例和您的代码段来制作一个简单的示例。

        get
        {
            var token = GetToken();
            string result = string.Empty;
            var url = new Uri("https://mydata.com/mapping/rest/services/GeoEvent/MyData/FeatureServer/0/query?where=0%3D0&text=&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&relationParam=&outFields=OBJECTID,SIID,COLL_METHOD,COLL_STATUS,COLL_CMTS,CREATED_BY,CREATED_DATE,MODIFIED_BY,MODIFIED_DATE,SID&returnGeometry=true&returnTrueCurves=false&maxAllowableOffset=&geometryPrecision=&outSR=4269&having=&returnIdsOnly=false&returnCountOnly=false&orderByFields=OBJECTID&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&historicMoment=&returnDistinctValues=false&resultOffset=&resultRecordCount=&queryByDistance=&returnExtentOnly=false&datumTransformation=&parameterValues=&rangeValues=&quantizationParameters=&featureEncoding=esriDefault&f=pjson");
            var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            httpWebRequest.Host = "mydata.com";
            httpWebRequest.Headers.Add("X-Esri-Authorization","Bearer " + token);
            httpWebRequest.Method = "GET";
            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                result = streamReader.ReadToEnd();
            }

                         
            Rootobject obj = JsonConvert.DeserializeObject<Rootobject>(result);
             foreach(Feature featureitem in obj.features)
            {
                Console.WriteLine(featureitem.attributes.OBJECTID + "-" + featureitem.attributes.COLL_STATUS + "-" + featureitem.attributes.CREATED_BY + "-" + featureitem.attributes.CREATED_DATE + "-" + featureitem.attributes.MODIFIED_BY + "-" + featureitem.attributes.COLL_CMTS + "-" + featureitem.attributes.SID + "-" + featureitem.attributes.SIID + "-" + featureitem.geometry.x + "-" + featureitem.geometry.y);
            }

因此,现在您有了足以让您开始享受的基础。

再多一点,您的上下文需要足够大才能显示您在DialogHost上放置的内容,这样您就不能在按钮周围放置整个对话框,最好在更大的范围内放置它,第一次尝试应该尝试在新页面上测试此上下文:

<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在此处进行修改或选择,则用户可以说是或否,然后根据需要重命名ACCEPT和CANCEL,就可以在内容下的Buttons那里。如果用户按下Enter键,“ IsDefault”将使该按钮被视为已按下。按下按钮会自动关闭该对话框。 并且由于ACCEPT和CANCEL都是按钮,您可以影响Click事件,这对于DialogHost的高级使用非常有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。