posts - 615, comments - 10478, trackbacks - 594, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

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

Posted on 2018-06-22 09:12 webabcd 阅读(...) 评论(...) 编辑 收藏

[源码下载]


背水一战 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
[源码下载]