• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

WPF自定义实现IP地址输入控件

c# 搞代码 4年前 (2022-01-09) 24次浏览 已收录 0个评论

一、前言

WPF没有内置IP地址输入控件,因此我们需要通过自己定义实现。

我们先看一下IP地址输入控件有什么特性:

  • 输满三个数字焦点会往右移
  • 键盘←→可以空光标移动
  • 任意位置可复制整段IP地址,且支持x.x.x.x格式的粘贴赋值
  • 删除字符会自动向左移动焦点

知道以上特性,我们就可以开始动手了。

二、构成

Grid+TextBox*4+TextBlock*3

通过这几个控件的组合,我们完成IP地址输入控件的功能。

界面代码如下:

<UserControl
 x:Class="IpAddressControl.IpAddressControl"
 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:local="clr-namespace:IpAddressControl"
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 Margin="10,0"
 d:DesignHeight="50"
 d:DesignWidth="800"
 mc:Ignorable="d" Background="White">
 <UserControl.Resources>
  <ControlTemplate x:Key="validationTemplate">
   <DockPanel>
    <TextBlock
     Margin="1,2"
     DockPanel.Dock="Right"
     FontSize="{DynamicResource ResourceKey=Heading4}"
     FontWeight="Bold"
     Foreground="Red"
     Text="" />
    <AdornedElementPlaceholder />
   </DockPanel>
  </ControlTemplate>
  <Style x:Key="CustomTextBoxTextStyle" TargetType="TextBox">
   <Setter Property="MaxLength" Value="3" />
   <Setter Property="HorizontalAlignment" Value="Stretch" />
   <Setter Property="VerticalAlignment" Value="Center" />
   <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="True">
     <Trigger.Setters>
      <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
      <Setter Property="BorderBrush" Value="Re<strong>本文来源gaodai#ma#com搞@代~码^网+</strong>d" />
      <Setter Property="Background" Value="Red" />
     </Trigger.Setters>
    </Trigger>
   </Style.Triggers>
  </Style>
 </UserControl.Resources>
 <Grid>
  <Grid.ColumnDefinitions>
   <ColumnDefinition MinWidth="30" />
   <ColumnDefinition Width="10" />
   <ColumnDefinition MinWidth="30" />
   <ColumnDefinition Width="10" />
   <ColumnDefinition MinWidth="30" />
   <ColumnDefinition Width="10" />
   <ColumnDefinition MinWidth="30" />
  </Grid.ColumnDefinitions>

  <!-- Part 1 -->
  <TextBox
   Grid.Column="0"
   BorderThickness="0"
   HorizontalAlignment="Stretch"
   VerticalAlignment="Stretch"
   VerticalContentAlignment="Center"
   HorizontalContentAlignment="Center"
   x:Name="part1"
   PreviewKeyDown="Part1_PreviewKeyDown"
   local:FocusChangeExtension.IsFocused="{Binding IsPart1Focused, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}"
   Style="{StaticResource CustomTextBoxTextStyle}"
   Validation.ErrorTemplate="{StaticResource validationTemplate}">
   <TextBox.Text>
    <Binding Path="Part1" UpdateSourceTrigger="PropertyChanged">
     <Binding.ValidationRules>
      <local:IPRangeValidationRule Max="255" Min="0" />
     </Binding.ValidationRules>
    </Binding>
   </TextBox.Text>
  </TextBox>
  <TextBlock
   Grid.Column="1"
   HorizontalAlignment="Center"
   FontSize="15"
   Text="."
   VerticalAlignment="Center"
  />

  <!-- Part 2 -->
  <TextBox
   Grid.Column="2"
   x:Name="part2"
   BorderThickness="0"
   VerticalAlignment="Stretch"
   VerticalContentAlignment="Center"
   HorizontalContentAlignment="Center"
   PreviewKeyDown="Part2_KeyDown"
   local:FocusChangeExtension.IsFocused="{Binding IsPart2Focused}"
   Style="{StaticResource CustomTextBoxTextStyle}"
   Validation.ErrorTemplate="{StaticResource validationTemplate}">
   <TextBox.Text>
    <Binding Path="Part2" UpdateSourceTrigger="PropertyChanged">
     <Binding.ValidationRules>
      <local:IPRangeValidationRule Max="255" Min="0" />
     </Binding.ValidationRules>
    </Binding>
   </TextBox.Text>
  </TextBox>
  <TextBlock
   Grid.Column="3"
   HorizontalAlignment="Center"
   FontSize="15"
   Text="."
   VerticalAlignment="Center"/>

  <!-- Part 3 -->
  <TextBox
   Grid.Column="4"
   x:Name="part3"
   BorderThickness="0"
   VerticalAlignment="Stretch"
   VerticalContentAlignment="Center"
   HorizontalContentAlignment="Center"
   PreviewKeyDown="Part3_KeyDown"
   local:FocusChangeExtension.IsFocused="{Binding IsPart3Focused}"
   Style="{StaticResource CustomTextBoxTextStyle}"
   Validation.ErrorTemplate="{StaticResource validationTemplate}">
   <TextBox.Text>
    <Binding Path="Part3" UpdateSourceTrigger="PropertyChanged">
     <Binding.ValidationRules>
      <local:IPRangeValidationRule Max="255" Min="0" />
     </Binding.ValidationRules>
    </Binding>
   </TextBox.Text>
  </TextBox>
  <TextBlock
   Grid.Column="5"
   HorizontalAlignment="Center"
   FontSize="15"
   Text="."
   VerticalAlignment="Center"/>

  <!-- Part 4 -->
  <TextBox
   Grid.Column="6"
   x:Name="part4"
   BorderThickness="0"
   VerticalAlignment="Stretch"
   VerticalContentAlignment="Center"
   HorizontalContentAlignment="Center"
   PreviewKeyDown="Part4_KeyDown"
   local:FocusChangeExtension.IsFocused="{Binding IsPart4Focused}"
   Style="{StaticResource CustomTextBoxTextStyle}"
   Validation.ErrorTemplate="{StaticResource validationTemplate}">
   <TextBox.Text>
    <Binding Path="Part4" UpdateSourceTrigger="PropertyChanged">
     <Binding.ValidationRules>
      <local:IPRangeValidationRule Max="255" Min="0" />
     </Binding.ValidationRules>
    </Binding>
   </TextBox.Text>
  </TextBox>
 </Grid>
</UserControl>

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:WPF自定义实现IP地址输入控件
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址