WPF 自定義一個可以編輯的TextBlock控件,仿照Excel的單元格樣式


先看效果

控件代碼

 1 [TemplatePart(Name = "Part_DisplayTextBlock", Type = typeof(TextBlock))]
 2     [TemplatePart(Name = "Part_EditTextBox", Type = typeof(TextBox))]
 3     public class EditableTextBlock : Control
 4     {
 5         // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
 6         public static readonly DependencyProperty TextProperty =
 7             DependencyProperty.Register("Text", typeof(string), typeof(EditableTextBlock), new FrameworkPropertyMetadata(default));
 8 
 9         static EditableTextBlock()
10         {
11             DefaultStyleKeyProperty.OverrideMetadata(typeof(EditableTextBlock), new FrameworkPropertyMetadata(typeof(EditableTextBlock)));
12         }
13 
14         public string Text
15         {
16             get { return (string)GetValue(TextProperty); }
17             set { SetValue(TextProperty, value); }
18         }
19 
20         public override void OnApplyTemplate()
21         {
22             base.OnApplyTemplate();
23 
24             var textBlock = GetTemplateChild("Part_DisplayTextBlock") as TextBlock;
25             var textBox = GetTemplateChild("Part_EditTextBox") as TextBox;
26             if (textBox == null || textBlock == null)
27             {
28                 return;
29             }
30             //啟動的時候設置TextBlock可見,textBox隱藏
31             textBlock.Visibility = Visibility.Visible;
32             textBox.Visibility = Visibility.Collapsed;
33             //給控件的鼠標雙擊事件掛載一個方法
34             MouseDoubleClick += (s, e) =>
35             {
36                 textBlock.Visibility = Visibility.Collapsed;
37                 textBox.Visibility = Visibility.Visible;
38                 textBox.Focus();//使TextBox獲得焦點
39             };
40             //給控件的失去焦點事件掛載一個方法
41             LostFocus += (s, e) =>
42             {
43                 textBox.Visibility = Visibility.Collapsed;
44                 textBlock.Visibility = Visibility.Visible;
45             };
46             ////給控件的鼠標離開事件掛載一個方法,這個好像不怎么好
47             //MouseLeave += (s, e) =>
48             //{
49             //    textBox.Visibility = Visibility.Collapsed;
50             //    textBlock.Visibility = Visibility.Visible;
51 
52             //};
53         }
54     }

樣式代碼

 1 <Style TargetType="{x:Type local:EditableTextBlock}">
 2         <Setter Property="Template">
 3             <Setter.Value>
 4                 <ControlTemplate TargetType="{x:Type local:EditableTextBlock}">
 5                     <Grid Width="{TemplateBinding Width}">
 6                         <TextBlock
 7                             x:Name="Part_DisplayTextBlock"
 8                             HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
 9                             VerticalAlignment="{TemplateBinding VerticalAlignment}"
10                             Text="{TemplateBinding Text}" />
11                         <TextBox
12                             x:Name="Part_EditTextBox"
13                             HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
14                             VerticalAlignment="{TemplateBinding VerticalAlignment}"
15                             Text="{TemplateBinding Text}" />
16                     </Grid>
17                 </ControlTemplate>
18             </Setter.Value>
19         </Setter>
20     </Style>

界面

 1 <Window
 2     x:Class="MvvmToolkit學習.MainWindow"
 3     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 4     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 5     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 6     xmlns:local="clr-namespace:MvvmToolkit學習"
 7     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 8     Title="MainWindow"
 9     Width="800"
10     Height="600"
11     d:DataContext="{d:DesignInstance Type=local:TestViewModel}"
12     mc:Ignorable="d">
13     <Window.Resources>
14         <Style TargetType="local:EditableTextBlock">
15             <Setter Property="VerticalAlignment" Value="Center" />
16             <Setter Property="HorizontalAlignment" Value="Center" />
17             <Setter Property="Height" Value="50" />
18             <Setter Property="Width" Value="200" />
19             <Setter Property="FontSize" Value="25" />
20         </Style>
21     </Window.Resources>
22     <Grid>
23         <StackPanel HorizontalAlignment="Center" Orientation="Vertical">
24             <Grid ShowGridLines="True">
25                 <Grid.RowDefinitions>
26                     <RowDefinition Height="*" />
27                     <RowDefinition Height="*" />
28                     <RowDefinition Height="*" />
29                 </Grid.RowDefinitions>
30                 <Grid.ColumnDefinitions>
31                     <ColumnDefinition Width="*" />
32                     <ColumnDefinition Width="*" />
33                 </Grid.ColumnDefinitions>
34                 <local:EditableTextBlock
35                     Grid.Row="0"
36                     Grid.Column="0"
37                     Text="AAAA" />
38                 <local:EditableTextBlock
39                     Grid.Row="0"
40                     Grid.Column="1"
41                     Text="AAAA" />
42                 <local:EditableTextBlock
43                     Grid.Row="1"
44                     Grid.Column="0"
45                     Text="AAAA" />
46                 <local:EditableTextBlock
47                     Grid.Row="1"
48                     Grid.Column="1"
49                     Text="AAAA" />
50                 <local:EditableTextBlock
51                     Grid.Row="2"
52                     Grid.Column="0"
53                     Text="AAAA" />
54                 <local:EditableTextBlock
55                     Grid.Row="2"
56                     Grid.Column="1"
57                     Text="AAAA" />
58             </Grid>
59             <TextBox Text="BBB" />
60 
61         </StackPanel>
62     </Grid>
63 </Window>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM