设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间21 现在时间21 缓存数据 人生真的不简单,很多时候想要用一份平静的心情对待生活,却总是锋烟四起,明明知道追逐梦想的路程,很苦,很累,很疲。累了,就好好休息吧,晚安!

人生真的不简单,很多时候想要用一份平静的心情对待生活,却总是锋烟四起,明明知道追逐梦想的路程,很苦,很累,很疲。累了,就好好休息吧,晚安!

查看: 618|回复: 2

WPF实现自带触控键盘的文本框

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:174
  • 打卡月天数:0
  • 打卡总奖励:2646
  • 最近打卡:2023-08-27 09:21:31
等级头衔

等級:晓枫资讯-上等兵

在线时间
10 小时

积分成就
威望
0
贡献
80
主题
153
精华
0
金钱
3068
积分
254
注册时间
2022-12-25
最后登录
2023-8-27

发表于 2022-12-27 12:09:53 | 显示全部楼层 |阅读模式
一 引入

项目有个新需求,当点击或触碰TextBox时,基于TextBox的相对位置,弹出一个自定义的Keyboard:



二 KeyboardControl

先实现一个自定义的KeyboardControl,它继承自Window。

Xaml代码如下:

  1. <Window x:Class="WpfApp1.KeyboardControl"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:local="clr-namespace:WpfApp1" AllowsTransparency="True" WindowStyle="None"
  5.         ResizeMode="NoResize" Background="Transparent" Height="290" Width="668">
  6.     <FrameworkElement.Resources>
  7.         <ResourceDictionary>
  8.             <Style TargetType="{x:Type Button}" x:Key="btnNum">
  9.                 <Setter Property="Width" Value="50"/>
  10.                 <Setter Property="Height" Value="50"/>
  11.                 <Setter Property="Margin" Value="0 0 5 5"/>
  12.                 <Setter Property="HorizontalContentAlignment" Value="Center" />
  13.                 <Setter Property="VerticalContentAlignment" Value="Center" />
  14.                 <Setter Property="Cursor" Value="Hand"/>
  15.                 <Setter Property="Template">
  16.                     <Setter.Value>
  17.                         <ControlTemplate TargetType="{x:Type Button}">
  18.                             <Border Name="border" BorderBrush="#FF474747" BorderThickness="1" CornerRadius="6">
  19.                                 <Border.Background>
  20.                                     <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
  21.                                         <GradientStop Color="#FFCCCCCC" />
  22.                                         <GradientStop Color="WhiteSmoke" Offset="0.5" />
  23.                                         <GradientStop Color="#FFCCCCCC" Offset="1" />
  24.                                     </LinearGradientBrush>
  25.                                 </Border.Background>
  26.                                 <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"
  27.                                     TextElement.Foreground="#333333" TextElement.FontSize="18" />
  28.                             </Border>
  29.                         </ControlTemplate>
  30.                     </Setter.Value>
  31.                 </Setter>
  32.             </Style>
  33.             <Style TargetType="{x:Type Button}" x:Key="btnFunc">
  34.                 <Setter Property="HorizontalContentAlignment" Value="Center" />
  35.                 <Setter Property="VerticalContentAlignment" Value="Center" />
  36.                 <Setter Property="Width" Value="50"/>
  37.                 <Setter Property="Height" Value="50"/>
  38.                 <Setter Property="Margin" Value="0 0 5 5"/>
  39.                 <Setter Property="Foreground" Value="#333333"/>
  40.                 <Setter Property="Cursor" Value="Hand"/>
  41.                 <Setter Property="Template">
  42.                     <Setter.Value>
  43.                         <ControlTemplate TargetType="{x:Type Button}">
  44.                             <Border
  45.                                 Name="border"
  46.                                 BorderBrush="#FF565656"
  47.                                 BorderThickness="1"
  48.                                 CornerRadius="6"  Background="Orange">
  49.                                 <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"
  50.                                     TextElement.Foreground="White" TextElement.FontSize="18" />
  51.                             </Border>
  52.                         </ControlTemplate>
  53.                     </Setter.Value>
  54.                 </Setter>
  55.             </Style>
  56.             <local:CapsConverter x:Key="CapsConverter"/>
  57.         </ResourceDictionary>
  58.     </FrameworkElement.Resources>

  59.     <Border Background="Gray" CornerRadius="6" BorderThickness="1" BorderBrush="#333333">
  60.         <StackPanel Margin="5 10 5 5" >
  61.             <Grid>
  62.                 <TextBox Name="tbValue" FontSize="28" Height="40"
  63.                     Background="Transparent" BorderBrush="Silver" BorderThickness="1"
  64.                     Foreground="White" HorizontalContentAlignment="Right"
  65.                     SelectionChanged="tbValue_TextChanged"
  66.                     TextChanged="tbValue_TextChanged" />
  67.             </Grid>
  68.             <WrapPanel  Orientation="Vertical" >
  69.                 <WrapPanel Margin="0 10 0 0">
  70.                     <Button Content="1" Click="Button_Click"  Style="{StaticResource btnNum}" />
  71.                     <Button Content="2" Click="Button_Click"  Style="{StaticResource btnNum}" />
  72.                     <Button Content="3" Click="Button_Click"  Style="{StaticResource btnNum}" />

  73.                     <Button Content="4" Click="Button_Click"  Style="{StaticResource btnNum}" />
  74.                     <Button Content="5" Click="Button_Click"  Style="{StaticResource btnNum}" />
  75.                     <Button Content="6" Click="Button_Click"  Style="{StaticResource btnNum}" />

  76.                     <Button Content="7" Click="Button_Click"  Style="{StaticResource btnNum}" />
  77.                     <Button Content="8" Click="Button_Click"  Style="{StaticResource btnNum}" />
  78.                     <Button Content="9" Click="Button_Click"  Style="{StaticResource btnNum}" />

  79.                     <Button Content="0" Click="Button_Click"  Style="{StaticResource btnNum}" />
  80.                     <Button Content="-" Click="Button_Click"  Style="{StaticResource btnNum}" />
  81.                     <Button Content="Del" Click="DELButton_Click"   Style="{StaticResource btnFunc}"  Margin="0 0 0 5"/>
  82.                 </WrapPanel>
  83.                 <WrapPanel Margin="25 0 0 0">
  84.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=q}"
  85.                             Click="Button_Click"/>
  86.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=w}"
  87.                             Click="Button_Click"/>
  88.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=e}"
  89.                             Click="Button_Click"/>
  90.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=r}"
  91.                              Click="Button_Click"/>
  92.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=t}"
  93.                              Click="Button_Click"/>
  94.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=y}"
  95.                              Click="Button_Click"/>
  96.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=u}"
  97.                              Click="Button_Click"/>
  98.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=i}"
  99.                              Click="Button_Click"/>
  100.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=o}"
  101.                              Click="Button_Click"/>
  102.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=p}"
  103.                              Click="Button_Click"/>
  104.                     <Button Content="Clear" Click="ClearButton_Click"  Style="{StaticResource btnFunc}"  />
  105.                 </WrapPanel>
  106.                 <WrapPanel Margin="45 0 0 0">
  107.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=a}"
  108.                              Click="Button_Click"/>
  109.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=s}"
  110.                              Click="Button_Click"/>
  111.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=d}"
  112.                              Click="Button_Click"/>
  113.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=f}"
  114.                              Click="Button_Click"/>
  115.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=g}"
  116.                              Click="Button_Click"/>
  117.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=h}"
  118.                              Click="Button_Click"/>
  119.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=j}"
  120.                              Click="Button_Click"/>
  121.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=k}"
  122.                              Click="Button_Click"/>
  123.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=l}"
  124.                              Click="Button_Click"/>
  125.                     <Button Content="." Click="Button_Click"  Style="{StaticResource btnNum}" />
  126.                 </WrapPanel>
  127.                 <WrapPanel Margin="70 0 0 0">
  128.                     <Button Content="A/a" Click="CapsButton_Click"  Style="{StaticResource btnFunc}"  />
  129.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=z}"
  130.                              Click="Button_Click"/>
  131.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=x}"
  132.                              Click="Button_Click"/>
  133.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=c}"
  134.                              Click="Button_Click"/>
  135.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=v}"
  136.                              Click="Button_Click"/>
  137.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=b}"
  138.                              Click="Button_Click"/>
  139.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=n}"
  140.                              Click="Button_Click"/>
  141.                     <Button Style="{StaticResource btnNum}" Content="{Binding Path=Caps,RelativeSource={RelativeSource AncestorType={x:Type local:KeyboardControl}},Converter={StaticResource CapsConverter},ConverterParameter=m}"
  142.                              Click="Button_Click"/>
  143.                     <Button Content="Cancel" Click="CancelButton_Click" IsCancel="True" Style="{StaticResource btnFunc}" Width="70"  />
  144.                     <Button Content="OK" Click="OKButton_Click" IsDefault="True" Style="{StaticResource btnFunc}" Width="70"  Margin="0 0 0 5"/>
  145.                 </WrapPanel>
  146.             </WrapPanel>
  147.         </StackPanel>
  148.     </Border>
  149. </Window>
复制代码

后台代码如下:

  1. public partial class KeyboardControl : Window
  2. {
  3.     private int TextIndex { get; set; }
  4.     public string TextStr { get; private set; }//通过该属性,访问Keyboard的文本

  5.     public KeyboardControl(string inputStr)//构造方式传入初始文本
  6.     {
  7.         InitializeComponent();

  8.         TextStr = inputStr;
  9.         tbValue.Text = inputStr;
  10.         tbValue.Focus();
  11.         tbValue.CaretIndex = inputStr.Length;
  12.     }

  13.     public static readonly DependencyProperty CapsProperty = DependencyProperty.Register(
  14.        "Caps", typeof(bool), typeof(KeyboardControl), new PropertyMetadata(default(bool)));
  15.     public bool Caps
  16.     {
  17.         get { return (bool)GetValue(CapsProperty); }
  18.         set { SetValue(CapsProperty, value); }
  19.     }


  20.     private void Button_Click(object sender, RoutedEventArgs e)
  21.     {
  22.         Button button = (Button)sender;
  23.         if (TextIndex == 0)
  24.         {
  25.             tbValue.Text += (string)button.Content;
  26.         }
  27.         else
  28.         {
  29.             tbValue.Text = tbValue.Text.Insert(TextIndex, (string)button.Content);
  30.         }
  31.     }

  32.     private void tbValue_TextChanged(object sender, RoutedEventArgs e)
  33.     {
  34.         TextBox textBox = (TextBox)sender;
  35.         TextIndex = textBox.CaretIndex;
  36.     }

  37.     private void ClearButton_Click(object sender, RoutedEventArgs e)
  38.     {
  39.         tbValue.Text = "";
  40.     }

  41.     private void DELButton_Click(object sender, RoutedEventArgs e)
  42.     {
  43.         if (tbValue.Text.Length > 0)
  44.         {
  45.             if (TextIndex == 0 && tbValue.Text.Length >= 1)
  46.             {
  47.                 tbValue.Text = tbValue.Text.Remove(tbValue.Text.Length - 1, 1);
  48.             }
  49.             else if (TextIndex > 0)
  50.             {
  51.                 tbValue.Text = tbValue.Text.Remove(TextIndex - 1, 1);
  52.             }
  53.         }
  54.     }

  55.     private void OKButton_Click(object sender, RoutedEventArgs e)
  56.     {
  57.         TextStr = tbValue.Text;
  58.         DialogResult = true;
  59.         Close();
  60.     }

  61.     private void CancelButton_Click(object sender, RoutedEventArgs e)
  62.     {
  63.         DialogResult = false;
  64.         Close();
  65.     }

  66.     private void CapsButton_Click(object sender, RoutedEventArgs e)
  67.     {
  68.         Caps = !Caps;
  69.     }
  70. }
复制代码

Xaml代码中用到了一个大小写的转换类:

  1. public class CapsConverter : IValueConverter
  2. {
  3.     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  4.     {
  5.         if (parameter == null)
  6.         {
  7.             return "";
  8.         }

  9.         if (value == null)
  10.         {
  11.             return parameter.ToString();
  12.         }

  13.         if (value is bool b)
  14.         {
  15.             return b ? parameter.ToString().ToUpper() : parameter.ToString().ToLower();
  16.         }
  17.         else
  18.         {
  19.             return parameter.ToString();
  20.         }
  21.     }

  22.     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  23.     {
  24.         throw new NotImplementedException();
  25.     }
  26. }
复制代码

三 TouchTextBox

定义一个TouchTextBox的分部类。

  1. public partial class TouchTextBox
  2. {
  3.     private Control hostControl;

  4.     //OnClick方法调用时,通过Window.ShowDialog方法,打开KeyboardControl
  5.     public void OnClick(object sender, MouseButtonEventArgs e)
  6.     {
  7.         if (sender is TextBox textBox)
  8.         {
  9.             hostControl = textBox;
  10.             //计算KeyboardControl的位置,弹出KeyboardControl
  11.             var text = Show(textBox.Text, textBox);
  12.             //KeyboardControl关闭后,获取其文本值,赋值给TextBox
  13.             if (!string.IsNullOrEmpty(text))
  14.             {
  15.                 textBox.Text = text;
  16.             }
  17.             else
  18.             {
  19.                 textBox.Text = string.Empty;
  20.             }
  21.         }
  22.     }

  23.     private string Show(string initValue, object sender = null)
  24.     {
  25.         var keyboard = new KeyboardControl(initValue);

  26.         SetPosition(keyboard);

  27.         bool result = keyboard.ShowDialog().Value;
  28.         if (result)
  29.         {
  30.             return keyboard.TextStr;
  31.         }
  32.         else
  33.         {
  34.             return string.Empty;
  35.         }
  36.     }

  37.     private void SetPosition(Window window)
  38.     {
  39.         Point point = hostControl.PointFromScreen(new Point(0.0, 0.0));
  40.         double width = SystemParameters.WorkArea.Width;
  41.         double height = SystemParameters.WorkArea.Height;
  42.         if (-point.Y + hostControl.ActualHeight + 5.0 + window.Height < height)
  43.         {
  44.             window.Top = -point.Y + hostControl.ActualHeight + 5.0;
  45.         }
  46.         else
  47.         {
  48.             window.Top = -point.Y - window.Height - 5.0;
  49.         }
  50.         if (-point.X + window.Width < width)
  51.         {
  52.             window.Left = -point.X;
  53.         }
  54.         else
  55.         {
  56.             window.Left = -point.X - (window.Width - hostControl.ActualWidth);
  57.         }
  58.     }
  59. }
复制代码

添加一个名为TouchTextBox的资源字典。

  1. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  2.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  3.                     x:Class="WpfApp1.TouchTextBox">
  4.     <Style x:Key="TouchTextBox" TargetType="{x:Type TextBox}">
  5.         <EventSetter Event="PreviewMouseLeftButtonDown" Handler="OnClick" />
  6.     </Style>
  7. </ResourceDictionary>
复制代码

四 效果展示

在App.Xaml中引入TouchTextBox.Xaml资源。

  1. <Application x:Class="WpfApp1.App"
  2.              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.              xmlns:local="clr-namespace:WpfApp1"
  5.              StartupUri="MainWindow.xaml">
  6.     <Application.Resources>
  7.         <ResourceDictionary>
  8.             <ResourceDictionary.MergedDictionaries>
  9.                 <ResourceDictionary Source="/WpfApp1;component/TouchTextBox.xaml" />
  10.             </ResourceDictionary.MergedDictionaries>
  11.         </ResourceDictionary>
  12.     </Application.Resources>
  13. </Application>
复制代码

MainWindow界面代码:

  1. <Window x:Class="WpfApp1.MainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6.         mc:Ignorable="d"
  7.         Title="MainWindow" Height="800" Width="1200">
  8.     <StackPanel>
  9.         <TextBox Text="Pop up the keyboard after touching" Width="400" HorizontalAlignment="Left"
  10.           FontSize="18" Margin="20,20"
  11.                  Style="{StaticResource TouchTextBox}"/>
  12.     </StackPanel>
  13. </Window>
复制代码

设置TextBox的Style为TouchTextBox,则该TextBox实现了自带触控键盘的效果。


晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
21
积分
22
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2023-1-28 13:52:04 | 显示全部楼层
感谢分享~~~~学习学习~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
15
积分
10
注册时间
2022-12-24
最后登录
2022-12-24

发表于 5 小时前 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表