zoukankan      html  css  js  c++  java
  • 背水一战 Windows 10 (122)

    [源码下载]


    背水一战 Windows 10 (122) - 其它: 通过 Windows.System.Profile 命名空间下的类获取信息, 查找指定类或接口的所在程序集的所有子类和子接口



    作者:webabcd


    介绍
    背水一战 Windows 10 之 其它

    • 通过 Windows.System.Profile 命名空间下的类获取信息
    • 查找指定类或接口的所在程序集的所有子类和子接口



    示例
    1、演示如何通过 Windows.System.Profile 命名空间下的类获取信息
    Information/ProfileInfo.xaml

    <Page
        x:Class="Windows10.Information.ProfileInfo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.Information"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="10 0 10 10">
    
                <TextBlock Name="lblMsg" TextWrapping="Wrap" Margin="0 10 10 10" />
    
            </StackPanel>
        </Grid>
    </Page>

    Information/ProfileInfo.xaml.cs

    /*
     * 演示如何通过 Windows.System.Profile 命名空间下的类获取信息
     *
     * 主要可获取到设备类型,系统版本号等
     */
    
    using System;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    using Windows.System.Profile;
    
    namespace Windows10.Information
    {
        public sealed partial class ProfileInfo : Page
        {
            public ProfileInfo()
            {
                this.InitializeComponent();
    
                this.Loaded += ProfileInfo_Loaded;
            }
    
            private void ProfileInfo_Loaded(object sender, RoutedEventArgs e)
            {
                // 获取设备类型,目前已知的返回字符串有:Windows.Mobile, Windows.Desktop, Windows.Xbox
                lblMsg.Text = string.Format("DeviceFamily: {0}", AnalyticsInfo.VersionInfo.DeviceFamily);
                lblMsg.Text += Environment.NewLine;
    
                // 获取系统版本号,一个长整型值
                lblMsg.Text += string.Format("DeviceFamilyVersion: {0}", AnalyticsInfo.VersionInfo.DeviceFamilyVersion);
                lblMsg.Text += Environment.NewLine;
    
                // 将长整型的系统版本号转换为 major.minor.revision.build 的方式
                string versionString = AnalyticsInfo.VersionInfo.DeviceFamilyVersion;
                ulong version = ulong.Parse(versionString);
                ulong v1 = (version & 0xFFFF000000000000L) >> 48;
                ulong v2 = (version & 0x0000FFFF00000000L) >> 32;
                ulong v3 = (version & 0x00000000FFFF0000L) >> 16;
                ulong v4 = (version & 0x000000000000FFFFL);
                string v = $"{v1}.{v2}.{v3}.{v4}";
    
                lblMsg.Text += string.Format("DeviceFamilyVersion(major.minor.revision.build): {0}", v);
                lblMsg.Text += Environment.NewLine;
    
    
    
                // 获取当前的“向 Microsoft 发送你的设备数据”的收集等级。在“设置”->“隐私”->“反馈和诊断”中配置(Security, Basic, Enhanced, Full)
                lblMsg.Text += string.Format("PlatformDiagnosticsAndUsageDataSettings.CollectionLevel: {0}", PlatformDiagnosticsAndUsageDataSettings.CollectionLevel);
                lblMsg.Text += Environment.NewLine;
    
                // 检查当前配置是否允许指定级别的信息收集
                lblMsg.Text += string.Format("PlatformDataCollectionLevel.Full: {0}", PlatformDiagnosticsAndUsageDataSettings.CanCollectDiagnostics(PlatformDataCollectionLevel.Full));
                lblMsg.Text += Environment.NewLine;
    
                // 在“设置”->“隐私”->“反馈和诊断”中配置的“向 Microsoft 发送你的设备数据”发生变化时触发的事件
                PlatformDiagnosticsAndUsageDataSettings.CollectionLevelChanged += PlatformDiagnosticsAndUsageDataSettings_CollectionLevelChanged;
            }
    
            private async void PlatformDiagnosticsAndUsageDataSettings_CollectionLevelChanged(object sender, object e)
            {
                await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    lblMsg.Text += string.Format("PlatformDiagnosticsAndUsageDataSettings.CollectionLevel: {0}", PlatformDiagnosticsAndUsageDataSettings.CollectionLevel);
                    lblMsg.Text += Environment.NewLine;
    
                    lblMsg.Text += string.Format("PlatformDataCollectionLevel.Full: {0}", PlatformDiagnosticsAndUsageDataSettings.CanCollectDiagnostics(PlatformDataCollectionLevel.Full));
                    lblMsg.Text += Environment.NewLine;
                });
            }
        }
    }


    2、用于查找指定类或接口的所在程序集的所有子类和子接口
    Tools/FindSubClass.xaml

    <Page
        x:Class="Windows10.Tools.FindSubClass"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.Tools"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <ScrollViewer Margin="10 0 10 10">
                <StackPanel Name="root" Margin="5">
    
                    <Button Name="btnFind" Content="查找指定类或接口的所在程序集的所有子类或子接口" Margin="1 5 1 20" Click="btnFind_Click" />
    
                </StackPanel>
            </ScrollViewer>
        </Grid>
    </Page>

    Tools/FindSubClass.xaml.cs

    /*
     * 用于查找指定类或接口的所在程序集的所有子类和子接口
     */
    
    using System;
    using System.Reflection;
    using System.Collections.Generic;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using System.Linq;
    
    namespace Windows10.Tools
    {
        public sealed partial class FindSubClass : Page
        {
            public FindSubClass()
            {
                this.InitializeComponent();
            }
    
            private void btnFind_Click(object sender, RoutedEventArgs e)
            {
                // 这样不行
                // Type type = Type.GetType("Windows.UI.Xaml.Controls.Button");
    
                Type type = typeof(Windows.UI.Xaml.UIElement);
    
                List<Type> subTypes = GetSubTypes(type);
                AddWrapGrid(subTypes);
            }
    
            private void AddWrapGrid(List<Type> subTypes)
            {
                VariableSizedWrapGrid wrapGrid = CreateWrapGrid();
                root.Children.Add(wrapGrid);
    
                foreach (Type type in subTypes)
                {
                    Button button = CreateButton(type);
                    wrapGrid.Children.Add(button);
                }
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                FrameworkElement button = sender as FrameworkElement;
                Type type = button.Tag as Type;
    
                int index = 0;
                // 删除被选中按钮的所属容器,以及此容器之后的所有控件
                if (button.Parent.GetType() == typeof(VariableSizedWrapGrid))
                    index = root.Children.IndexOf(button.Parent as UIElement);
                // 删除被选中按钮,以及此按钮之后的所有控件
                else
                    index = root.Children.IndexOf(button);
                while (root.Children.Count > index)
                {
                    root.Children.RemoveAt(root.Children.Count - 1);
                }
    
                // 将被选中按钮添加到根容器
                Button buttonNew = CreateButton(type);
                root.Children.Add(buttonNew);
                root.Children.Add(new Grid() { Height = 20 });
    
                // 将被选中类的所有子类添加到根容器
                List<Type> subTypes = GetSubTypes(type);
                AddWrapGrid(subTypes);
            }
    
            private VariableSizedWrapGrid CreateWrapGrid()
            {
                VariableSizedWrapGrid wrapGrid = new VariableSizedWrapGrid();
                wrapGrid.Orientation = Orientation.Vertical;
                wrapGrid.ItemWidth = 9999;
                wrapGrid.HorizontalAlignment = HorizontalAlignment.Stretch;
    
                return wrapGrid;
            }
    
            private Button CreateButton(Type type)
            {
                Button button = new Button();
                button.Content = type.ToString();
                button.Margin = new Thickness(1);
                button.Tag = type;
                button.Click += Button_Click;
    
                return button;
            }
    
            // 获取儿子类,孙子及以下级别不会返回
            private List<Type> GetSubTypes(Type type)
            {
                List<Type> subTypes = new List<Type>();
    
                Type[] assemblyTypes = type.GetTypeInfo().Assembly.GetTypes();
    
                foreach (Type t in assemblyTypes)
                {
                    if (type.GetTypeInfo().IsInterface)
                    {
                        if (t.GetInterfaces().Contains(type))
                        {
                            subTypes.Add(t);
                        }
                    }
                    else 
                    {
                        if (t.GetTypeInfo().BaseType == type)
                        {
                            subTypes.Add(t);
                        }
                    }
                }
    
                subTypes = subTypes.OrderBy(p => p.FullName).ToList();
    
                return subTypes;
            }
        }
    }



    OK
    [源码下载]

  • 相关阅读:
    第一个Android应用 扫描宝 欲挑战传统扫描枪
    前端工程师在实现支付功能的时候能做些什么(V客学院技术分享)?
    HBuilder android 打包指南(V客学院技术分享)
    JavaScript 事件处理详解
    关于webpack的path和publicPath。
    svg线条的动画到渐变
    vue目录结构及其对应作用
    数据改变视图未变问题解决(Object.assign)
    ES6语法的简单介绍——拓展运算符
    webpack打包原理
  • 原文地址:https://www.cnblogs.com/webabcd/p/9211815.html
Copyright © 2011-2022 走看看