Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
2 / 2 / 3
Регистрация: 01.06.2013
Сообщений: 87
1

CustomControl, insert и прыгучий курсор

13.08.2015, 12:02. Показов 591. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Делаю свой контрол, всё очень плохо.
Знакомьтесь, текстбокс для Decimal!

Xaml:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<UserControl x:Class="DecimalBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyProject"
             xmlns:glob="clr-namespace:System.Globalization;assembly=mscorlib"
             mc:Ignorable="d"
             Name="parent"
             d:DesignHeight="32" d:DesignWidth="120">
    <UserControl.Resources>
        <local:DecimalConverter x:Key="DecimalConverter"></local:DecimalConverter>
    </UserControl.Resources>
 
    <Grid>
        <local:TextBoxWatermark x:Name="textBox" 
                                Text="{Binding ElementName=parent, Path=Decimal, UpdateSourceTrigger=PropertyChanged, ConverterCulture={x:Static glob:CultureInfo.CurrentCulture}, StringFormat={}{0:#,##0.0#########}}" 
                                LimitPattern="OnlyDecimal" 
                                MaxLength="28"
                                IsShowError="{Binding ElementName=parent, Path=IsShowError}"
                                CheckTextIsEmpty="{Binding ElementName=parent, Path=CheckTextIsEmpty}"/>
    </Grid>
</UserControl>
xaml.cs:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace MyProject
{
    /// <summary>
    /// Interaction logic for DecimalBox.xaml
    /// </summary>
    public partial class DecimalBox : UserControl
    {
        public DecimalBox ()
        {
            InitializeComponent();
        }
 
        public static readonly DependencyProperty DecimalProperty = DependencyProperty.Register("Decimal", typeof(decimal), typeof(DecimalBox ), new PropertyMetadata(null));
        public decimal Decimal
        {
            get {return (decimal)GetValue(DecimalProperty); }
            set { SetValue(DecimalProperty, value); }
        }
 
        public static readonly DependencyProperty CheckTextIsEmptyProperty = DependencyProperty.Register("CheckTextIsEmpty", typeof(bool), typeof(DecimalBox ), new PropertyMetadata(false));
        public bool CheckTextIsEmpty
        {
            get { return (bool)GetValue(CheckTextIsEmptyProperty); }
            set { SetValue(CheckTextIsEmptyProperty, value); }
        }
 
    }
}


ну и для тех, кто хочет узнать, какого это, когда кровь течёт из глаз, один из костылей- превью обработчик кнопок:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
//custom handler for delete and backspace of Decimal TextBox.
            if (this.LimitPattern==TextBoxValidPattern.OnlyDecimal)
            {
                int pos = this.SelectionStart;
                // Deleting a character (Delete key).
                // This jumps over format characters.
                if (e.Key == Key.Delete && pos<this.Text.Length-1)
                {
                    int razdelIndex = this.Text.IndexOf(',') > 0 ? this.Text.IndexOf(',') : this.Text.IndexOf('.');
                    if (this.SelectionLength > 0)
                    {
                        if (this.SelectionLength==this.Text.Length)
                        {
                            this.Text = "0";
                        }
                        else
                        {
                            if (pos + this.SelectionLength <= razdelIndex)
                            {
                                this.Text = this.Text.Remove(pos, this.SelectionLength).Replace("  ", " ").Trim();
                            }
                            if (pos >= razdelIndex)
                            {
 
                                int length = this.SelectionLength;
                                if (pos == razdelIndex)
                                {
                                    pos++;
                                    length--;
                                }
                                if (pos + length == this.Text.Length)
                                {
                                    this.Text = this.Text.Substring(0, razdelIndex);
                                }
                                else
                                {
                                    for (int i = pos; i < pos + length; i++)
                                    {
                                        this.Text = this.Text.Remove(i, 1);
                                        this.Text = this.Text.Insert(i, "0");
                                    }
                                }
                                
                            }
                            if (pos < razdelIndex && pos + this.SelectionLength > razdelIndex)
                            {
                                if (pos + this.SelectionLength - 1 == Text.Length)
                                {
                                    this.Text = this.Text.Substring(0, pos);
                                }
                                else
                                {
                                    string temp = this.Text.Substring(pos + this.SelectionLength);
                                    this.Text = this.Text.Substring(0, pos) + (this.Text.Contains('.') ? '.' : ',') + (temp.Length == 1 ? "0" : "") + temp;
                                    this.SelectionLength = 0;
                                }
                            }
                        }
                    }
                    else
                    {
                        if (this.Text[pos] == ',' || this.Text[pos] == '.')
                        {
                            pos++;
                        }
                        else if ((int)this.Text[pos] == 160)
                        {
                            this.Text = this.Text.Remove(pos, 2);
                            pos++;
                            if ((razdelIndex - 1) % 4 == 0)
                            {
                                pos--;
                            }
                        }
                        else if (this.Text.Length==4&&pos==0)
                        {
                            this.Text = '0' + this.Text.Substring(1);
                            pos++;
                        }
                        else
                        {
                            this.Text = this.Text.Remove(pos, 1).Trim();
                            if ((razdelIndex - 1) % 4 == 0)
                            {
                                pos--;
                            }
                        }
                    }
 
                    this.SelectionStart = pos > 0 ? pos : 0;
                    e.Handled = true;
                }
                // Deleting a character (backspace).
                // This steps over a format character, but doesn't
                // delete the next character.
                if (e.Key == Key.Back)
                {
                    int razdelIndex=this.Text.IndexOf(',')>0 ? this.Text.IndexOf(',') : this.Text.IndexOf('.');
                    if (this.SelectionLength > 0)
                    {
                        if (this.SelectionLength == this.Text.Length)
                        {
                            this.Text = "0";
                        }
                        else
                        {
                            if (pos + this.SelectionLength <= razdelIndex)
                            {
                                this.Text = this.Text.Remove(pos, this.SelectionLength).Replace("  ", " ").Trim();
                            }
                            if (pos >= razdelIndex)
                            {
 
                                int length = this.SelectionLength;
                                if (pos == razdelIndex)
                                {
                                    pos++;
                                    length--;
                                }
                                if ((pos + length - 1) == Text.Length)
                                {
                                    this.Text=this.Text.Substring(0,razdelIndex);
                                }
                                else
                                {
                                    for (int i = pos; i < pos + length; i++)
                                    {
                                        this.Text = this.Text.Remove(i, 1);
                                        this.Text = this.Text.Insert(i, "0");
                                    }
                                }
                            }
                            if (pos < razdelIndex && pos + this.SelectionLength > razdelIndex)
                            {
                                if (pos + this.SelectionLength - 1 == Text.Length)
                                {
                                    this.Text = this.Text.Substring(0, pos);
                                }
                                else
                                {
                                    string temp = this.Text.Substring(pos + this.SelectionLength);
                                    this.Text = this.Text.Substring(0, pos) + (this.Text.Contains('.') ? '.' : ',') + (temp.Length == 1 ? "0" : "") + temp;
                                    this.SelectionLength = 0;
                                }
                            }
                        }
                    }
                    else
                    {
                        if (pos>0)
                        {
                            if (this.Text[pos - 1] == ',' || this.Text[pos - 1] == '.')
                            {
                                pos--;
                            }
                            else if ((int)this.Text[pos - 1] == 160 && pos > 2)
                            {
                                this.Text = this.Text.Remove(pos - 2, 2);
                                pos = pos - 2;
                            }
                            else if (this.Text.Length == 4 && pos == 1)
                            {
                                this.Text = '0' + this.Text.Substring(1);
                                pos--;
                            }
                            else
                            {
                                this.Text = this.Text.Remove(pos - 1, 1).Trim();
                                pos--;
                                if ((razdelIndex-1) % 4 == 0)
                                {
                                    pos--;
                                }
                            }
                        }
                    }
 
                    this.SelectionStart = pos>0 ? pos : 0;
                    e.Handled = true;
                }
                if (e.Key == Key.OemComma || e.Key == Key.OemPeriod || e.Key == Key.Decimal)
                {
                    int razdelIndex = this.Text.IndexOf(',') > 0 ? this.Text.IndexOf(',') : this.Text.IndexOf('.');
                    if (this.SelectionStart==razdelIndex)
                    {
                        this.SelectionStart++;
                        e.Handled = true;
                    }
                }
            }


проблемы:
1) при нажатии insert включается режим ввода "заменой", когда перепечатываешь разделитель (запятую), шаблон видит, что что-то не так и добавляет в конец ",0", как бы перебрасывая в итоге разряд. хочу отключить замену запятой, но как бы это отловить?
пс: думал как-нить в превью тоже закинуть, потому костыль и кинул, но свойство у e.key не нашёл.
2) при вводе 10го символа слева от запятой происходит какой-то баг и курсор начинает прыгать туда-сюда после каждого введённого символа слева от запятой. говорят что-то не так с форматом (пробовал сделать через конвертер - та же фигня), так что я хз. В общем, есть какие идеи, как сохранить курсор на месте?

Добавлено через 15 часов 34 минуты
актуально.

Добавлено через 2 часа 7 минут
с инсертом разобрался. про перепрыгивания курсора не понимаю до сих пор.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2015, 12:02
Ответы с готовыми решениями:

Как реализовать привязку Textbox.Text к свойству типа string в Customcontrol?
Как я делал.Я создал Customcontrol?Сначала я создал свойство зависимости и зарегистрировал его. ...

Picklist Customcontrol
Добрый день. Может кто подскажет как реализовать следующее: Есть пиклист с полем для поиска и...

Передача Datasourcedocument В Customcontrol
Господа, начался полный коллапс в мозгах. Выручайте. Объясните как совсем тупому. Не могу понять...

получить данные из Customcontrol и записать их в поле на Xpages
Добрый день! В xpages вставил customcontrol, в который вписал представление. по нажатию на...

4
Жуткая тВарЬ
393 / 328 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
13.08.2015, 12:06 2
Chronya, Простите пожалуйста, но Вы какую то фигню делаете - нахрена создавать контрол, который выполняет функцию текстбокса если есть сам текстбокс, что валидация данных уже не канает, а стрингформат вообще не раритет - не горовя уже о логике гетеров и сетеров !?!?!?!?!?!?

Начните нормально изучать Wpf и ищите решения используя мозг, а не бросаясь на амбразуру по пути наименьшего сопротивления (имеется ввиду лишь бы не думать, но делать)
0
2 / 2 / 3
Регистрация: 01.06.2013
Сообщений: 87
13.08.2015, 13:31  [ТС] 3
ну там кроме этой валидации много чего добавлено, просто скинул я только то, что хоть как-то относится к делу.
книгу я читаю в свободное время, но под дедлайн этого свободного времени не сказать, что сильно много.
0
Жуткая тВарЬ
393 / 328 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
13.08.2015, 15:13 4
Цитата Сообщение от Chronya Посмотреть сообщение
ну там кроме этой валидации много чего добавлено
Я Вас не пойму - ТекстБокс это некий контрол в который вводят значения, после чего (или в процессе) эти значения можно проверить, обработать и т.д.
Вы из него хотите сделать редактор документов типа Ворд ??? В чем суть такого подхода?
0
2 / 2 / 3
Регистрация: 01.06.2013
Сообщений: 87
13.08.2015, 15:39  [ТС] 5
по сути надо кучу текстбоксов с разными разрешёнными значениями, ну и заказчик хочет, что б эти текстбоксы так же умели творить разную фигатень.
я наследуюсь от текстбокса, но, почему-то, некоторые стандартные текстбоксовские инструменты работают весьма криво, приходится оверврайтить.
0
13.08.2015, 15:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.08.2015, 15:39
Помогаю со студенческими работами здесь

Не работает Num Lock, курсор на нем, сам курсор неактивен
Помогите решить проблему, с ней не справляется наш программист (для раб.ПК). Не знаю, что делать и...

В форме при активации курсор посредине, убрал курсор с формы она должна закрыться
Здравствуйте, чем вспоминать дни прошедшие..., есть форма, (она из Ворда), по задумке - она...

Системный курсор загружается, а курсор из файла ресурсов-нет
Создала файл курсора с помощью добавления в файл ресурсов нового элемента. Курсор -Cursor.cur. При...

Перенос параметра при INSERT в другой запрос INSERT
Здравствуйте. Есть таблица Сlient, в которую при INSERT ClientID присваивается инкрементом. На...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru