powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF + CustomControl + TextBox
25 сообщений из 92, страница 1 из 4
WPF + CustomControl + TextBox
    #37301960
Alex Shulg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Пытаюсь реализовать свой контрол, который содержит внутри себя, кроме прочего, TextBox. Контрол имеет свойство Text , которое аналогично такому же свойству TextBox'а :
Код: plaintext
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.
    [TemplatePart(Name = "PART_TextBox", Type = typeof(TextBox))]
    ...
    public class MyControl : Control
    {
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text", typeof(String), typeof(MyControl),
            new UIPropertyMetadata(null, new PropertyChangedCallback(OnTextChanged)));

        public static readonly RoutedEvent TextChangedEvent =
            EventManager.RegisterRoutedEvent("TextChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyControl));

        private static void OnTextChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            MyControl textBox = o as MyControl;
            if (textBox != null)
                textBox.OnTextChanged((String)e.OldValue, (String)e.NewValue);
        }

        protected virtual void OnTextChanged(String oldValue, String newValue)
        {
            this.RaiseEvent(new RoutedEventArgs(MyControl.TextChangedEvent, this));
        }

        public String Text
        {
            get { return (String)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        public event RoutedEventHandler TextChanged
        {
            add { AddHandler(TextChangedEvent, value); }
            remove { RemoveHandler(TextChangedEvent, value); }
        }

        ... разное другое
    }
Generic.xaml расписан так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    <Style TargetType="{x:Type local: MyControl}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local: MyControl }">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <DockPanel LastChildFill="True" >

                            ...

                            <TextBox x:Name="PART_TextBox" 
                                     Text="{Binding Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource TemplatedParent}}"
                                     BorderBrush="{x:Null}" BorderThickness="0" VerticalAlignment="Center" />
                        </DockPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

В приложении (xaml) использую так:
Код: plaintext
<MyControls:MyControl Text="{Binding Path=MyClass.Text, UpdateSourceTrigger=PropertyChanged, RelativeSource={...}}" /> 
В результате все отображается как надо, TextBox внутри MyControl отображает MyClass.Text, но при изменении строки в интерфейсе, изменения не доходят до MyClass.Text (значение остается прежнее). При этом если использовать просто TextBox:
Код: plaintext
<TextBox Text="{Binding Path=MyClass.Text, UpdateSourceTrigger=PropertyChanged, RelativeSource={...}}" />
все работает.
Такое впечатление, что в MyControl я чего-то недописал... Если кто знает в чем может быть проблема, где я чего упустил, подскажите, пожалуйста.

Заранее благодарю.
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #37302331
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UIPropertyMetadata ClassProvides property metadata for non-framework properties that do have rendering/user interface impact at the core level.

FrameworkPropertyMetadata (derived from this class) is the more common metadata class used for framework-level properties that also have rendering/user interface impact.
Может использовать FrameworkPropertyMetadata?
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #37302670
Alex Shulg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за подсказку!!! То что нужно:
Код: plaintext
1.
2.
3.
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text", typeof(String), typeof(TextBoxButton),
            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(OnTextChanged)));
сочетание FrameworkPropertyMetadata + FrameworkPropertyMetadataOptions.BindsTwoWayByDefault = работает!!!
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #37302685
Alex Shulg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex ShulgВ приложении (xaml) использую так:
Код: plaintext
<MyControls:MyControl Text="{Binding Path=MyClass.Text, UpdateSourceTrigger=PropertyChanged, RelativeSource={...}}" /> 


Все оказалось проще:
Код: plaintext
<MyControls:MyControl Text="{Binding Path=MyClass.Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={...}}" /> 
Забыл установить Mode=TwoWay в привязке!!!

Так что все работает и с UIPropertyMetadata. Но все равно, спасибо, наводка помогла.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
WPF + CustomControl + TextBox
    #39629861
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня такой вопрос по поводу кастомного контрола. Если мне надо сделать график некой функции (с выбором параметров линии таких как цвет, толщина, тип и толщина шрифта) какой контрол наследовать - control или canvas? Если в этом контроле есть кроме самой линии/функции, линии ординат, текстовые надписи к ординатам, паралельные ординатам линии - может это надо применять usercontrol как групировку нескольких существующих компонентов, или в custom control можно тоже использовать вложенные компоненты в xaml-разметке?
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39630071
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrtУ меня такой вопрос по поводу кастомного контрола. Если мне надо сделать график некой функции (с выбором параметров линии таких как цвет, толщина, тип и толщина шрифта) какой контрол наследовать - control или canvas? Если в этом контроле есть кроме самой линии/функции, линии ординат, текстовые надписи к ординатам, паралельные ординатам линии - может это надо применять usercontrol как групировку нескольких существующих компонентов, или в custom control можно тоже использовать вложенные компоненты в xaml-разметке?
Я бы не изобретал велосипед, а взял готовое .
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39630076
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Готовое, изобретенное мной, мне надо именно предоставить. Вроде не так уж сложно в теории, если не надо от руки линию рисовать. Хотя очень многокомпонентный контрол должен получиться, и на коудпрожекте он расширяет userproject. Более того там он использует стороннюю библиотеку, которая в первую очередь помогает для биндинга событий, что наверное в моем случае тоже будет ключевым моментом если кроме dependency properties, использовать routed events.
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39630109
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Canvas и Path+Geomtry
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39630291
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да canvas может и подойдет но это лейаут. А вот вместо линии графика наверное надо Polyline. Меня интересует лиш то если групировать отдельные конттролы типа квадратной разметки графика, линий ординат, самой линии - возможно ли это все поместить в generic.xaml. Еще одним условием надо использовать несколько dependency properties для свойств графика. Но например здесь https://www.codeproject.com/Articles/49802/Create-a-WPF-Custom-Control-Part идет речь, что кастом контрол не имеет "design surface", и в общем он используется для расширение например одного компонента, в частности кнопки - а у меня мультикомпонентный контрол? Вот бы пример найти такой?
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39630305
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrtесли групировать отдельные конттролы типа квадратной разметки графика, линий ординат,я не понял.
Обычно сетка координат и т.д. описанное рисуется в динамике и не является отдельными контролами для группировки.
Так можно и буквы группировать из закорючек контролов XAML
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39630411
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть все описание кастомного компонента должно быть в коде, а изменение шрифта, толщины линии будут реализованы через dependency property? Как тогда привязывать внешние события (например изменение шрифта) к этим property? В общем такой вариант приводится даже в целой книги о графиках wpf, но там он идет как user control тоже. Но там тоже есть textblock и т.д. А во всех примерах C.C. это расширение одного контрола, и композиция нескольких других существующих вроде не предполагается.
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631250
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если простое наследование Control подходит через добавление к дефолтному Border - Canvas/Grid в качестве потомка. То в последнем случае сразу возникает проблема после необходимости добавление в generic.xaml - x:class="wpfapp.customcontrol" что требует наличие ивент-обработчика. Ошибка такого типа после этого добавления - CustomControl:Control требует partial modifier ибо определение такого класа вроде уже есть. После добавление partial - уже другая ошибка can not be same definition for different base class??
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631314
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xaml должен начинаться с
Код: xml
1.
<wpfapp.customcontrol ....
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631538
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, Да начинается он стандартно -
generics.xaml - только вот проблема может в том что всю разметку я помещаю в <Style, где есть <Border (ведь наследую я так - CustomControl:Control) всередину которого я помещаю Grid, a в нее потом другие компоненты как в UserControl - Только так я могу использовать как Customcontrol. Но посколько у меня есть event handler - я должен, ибо требует компилятор, добавить в шапку x:class="wpfapp.customcontrol", ссылка на полное имя класа где есть в том числе метод событие. Но после этого и появляется ошибка что надо partial modifier - ибо дефиниция custom control уже есть. Но она одна есть а не две. После добавление уже слова partial - уже ошибка что не может одной дефиниции/ или слова pаrtiаl (сейчас точно не помню) для разных базовых класов??
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631548
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты сейчас пытаешься объяснить жестами, как поёт Паваротти ))

Можешь дать тестовый пример? Только абсолютно тестовый, без всякого постороннего хлама, который не хочет работать. Желательно в виде архива проекта. Тогда можно будет чем-то помочь.
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631551
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас есть элемент управления, который вы создали сами
class MyControl : Control
Есть элементу управления которые входят в его шаблон.
Вам нужно получать от них события и обрабатывать внутри этого элемента управления?
зачем вам тогда Behavior класс? я не понимаю
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631561
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может надо переписать generic.xaml полностью. Чтобы он был более похожим на хаml обычного контрола. А все манипуляции этого контрола наверное надо уже будет делать при его добавление в main window - и привязывание его custom properties к custom / routed events - шаблон юзер контрола для хотя бы построение такого графика у меня есть.
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631565
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrt,

Я полностью перестал понимать.
Скорее всего, ты идешь не тем путем.
Ты пытаешься обсуждать не подход к решению какой-то проблемы, а твою (возможно неверную) реализацию этого решения.
Попробуй от печки.
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631578
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
customcontrol:control - это клас созданный автоматически
при создание нового customcontrol - new item- wpf... Если бы под рукой был код - но например customcontrol:control на котором выскакивает ошибка pаrtiаl собственно пуст... А generics.xaml - вызывает эту ошибку после добавление x:class - результат стандартного требование если в разметке есть ссылка на обработку события (в этом случае - grid_size_changed).
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631619
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrt,
то есть очевидная проблема в дублирование класа что ли. Может такое быть x:class=customclass быть вторым частичным класом? Но это всего лиш ссылка и в разметке тем более. О каких разных базовых класах может быть речь в последней ошибке- partial customcontrol:control и сам control? Может дебагер может больше подсказать где есть второй скрытый клас, ибо сам компилятор никаких ссылок не предоставляет.
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631624
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Создайте свой класс, наследуйте его от Control
2) переопределите в нём стиль по умолчанию
3) создайте стиль по умолчанию в generic.xaml
профит, в чем грабли я не понимаю?
UserControl наследует не Control, а ContentControl. Я им вообще не пользуюсь, так как от ContentControl он по сути ничем не отичается.

mycontrol.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.
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.
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace WpfApp3
{
    [TemplatePart(Name = "PART_MyTextBox", Type = typeof(TextBox))]
    public class MyControl : Control
    {

        public MyControl()
        {
            //добавляет обработчик команды от кнопки
            CommandBindings.Add(new CommandBinding(MyCommand, OnMyCommand));
            //добавляет обработчик маршрутизируемого события
            AddHandler(TextBox.TextChangedEvent, new RoutedEventHandler(OnTextChanged));
        }

        private void OnTextChanged(object sender, RoutedEventArgs e)
        {
            Debug.Print("Text changned from routed event");

        }

        private void OnMyCommand(object sender, ExecutedRoutedEventArgs e)
        {
            MessageBox.Show("Trololo");
        }

        public static ICommand MyCommand = new RoutedCommand(nameof(MyCommand), typeof(MyControl));

        static MyControl()
        {
            //задаем свой стиль поумолчанию
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl), new FrameworkPropertyMetadata(typeof(MyControl)));
        }

        private TextBox _childTextBox;

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            //получает предопределенный элемент шаблона (элемент должен присутствовать в шаблоне и должен быть описан в атрибутах класса)
            _childTextBox = GetTemplateChild("PART_MyTextBox") as TextBox;
            //подписывает на событие этого элемента управления
            _childTextBox.TextChanged += _childTextBox_TextChanged;

        }

        private void _childTextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            Debug.Print("Text changned from direct event");
        }
    }
}


themes\generic.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.
24.
25.
26.
27.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:WpfApp3">

    <ControlTemplate x:Key="MyControlDefaultTemplate" TargetType="{x:Type local:MyControl}">
        <Border Background="{TemplateBinding Background}" 
                BorderThickness="{TemplateBinding BorderThickness}"
                BorderBrush="{TemplateBinding BorderBrush}">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <TextBox Grid.Row="0" x:Name="PART_MyTextBox"/>
                
                <StackPanel Grid.Row="1">
                    <Button Content="MyButton" Command="{x:Static local:MyControl.MyCommand}" />
                </StackPanel>
                            
            </Grid>
        </Border>
    </ControlTemplate>

    <Style TargetType="{x:Type local:MyControl}">
        <Setter Property="Template" Value="{StaticResource MyControlDefaultTemplate}"/>
    </Style>
</ResourceDictionary>
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631662
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Собственно я наследую Control. В нем и есть конструктор static CustomControl{ defaultkeypropert ... Хотя стили здесь никакой роли наверное не играют, кроме если они привязаны к dependencyproperty - надо просто нарисовать график со всеми линиями, чтобы не выскакивали ошибки в том числе последняя. Шаблоный код у меня есть, от usercontrol кстати, и там эта ошибка очевидно не появляется.
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631671
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы пишите, что у вас какая то проблема с Partial классом, мне не понятно, от куда она у вас берется, так как в примере моем, не Partial классы, они там не нужны от слова совсем.
Объясните нормально, в чем у вас ошибка, пример с воспроизведенной проблемой в студию.
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631760
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes, вам наверное проще создать кастомный контрол автоматически, в gеnеric.xаml вставить в бордер, грид, с любым суб- компонентом с ивентом добавить x:clаss, и включить инстанс этого кастом контрола в главный xаml.
...
Рейтинг: 0 / 0
WPF + CustomControl + TextBox
    #39631788
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть помощь нужна вам, но мы должны еще и воспроизводить вашу ситуацию по неясным обрывкам рассуждений, вместо того, чтобы получить от вас тестовый проект?
...
Рейтинг: 0 / 0
25 сообщений из 92, страница 1 из 4
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF + CustomControl + TextBox
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]