Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать custom control, проблемы с привязками данных 
:(
    Опции темы
Anyone
Дата 1.8.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Создал custom control, производный от Canvas (называется UgeDrawingCanvas), который требует отдельные скроллы для прокрутки содержимого.
Внешний вид его с помощью шаблона определить не удалось, поскольку у него нет свойства Template.
Потому решил создать еще один ползовательский элемент управления (GraphicEditor), производный от Control, который будет содержать и скроллы и UgeDrawingCanvas, а также все остальные необходимые (но уже не обязательные) элементы.
Написал для него такой стиль:
Код

    <ControlTemplate x:Key="GraphicEditorDefaultTemplate" TargetType="{x:Type local:GraphicEditor}">
        <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>

                <local:UgeDrawingCanvas x:Name="PART_DrawingCanvas" Grid.Row="0" Grid.Column="0" Width="Auto" Height="Auto"/>
                <ScrollBar Name="PART_ScrollBarVertical" Grid.Row="0" Grid.Column="1" Orientation="Vertical"/>
                <ScrollBar Name="PART_ScrollBarHorisontal" Grid.Row="1" Grid.Column="0" Orientation="Horizontal"/>
                <Button Grid.Row="1" Grid.Column="1" Width="Auto" Height="Auto"/>
            </Grid>
        </Border>
    </ControlTemplate>


    <Style TargetType="{x:Type local:GraphicEditor}">
        <Setter Property="Template" Value="{StaticResource GraphicEditorDefaultTemplate}"/>
    </Style>

Видно, что он имеет 3 именованные части.
Необходимо связать их:
Код

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            UgeDrawingCanvas ugeDrawingCanvas = GetTemplateChild("PART_ScrollBarVertical") as UgeDrawingCanvas;
            if (ugeDrawingCanvas!=null)
            {
                ScrollBar scrollBarVertical = GetTemplateChild("PART_ScrollBarVertical") as ScrollBar;
                if (scrollBarVertical != null)
                {
                    Binding binding = new Binding("Value");
                    binding.Source = scrollBarVertical;
                    binding.Mode = BindingMode.TwoWay;
                    ugeDrawingCanvas.SetBinding(UgeDrawingCanvas.ScrollOffsetYProperty, binding);
                }
            }
        } 

Но никакая привязка на самом деле не получилась, наверное потому, что ScrollOffsetY - это свойство UgeDrawingCanvas-a, а не того контрола для которого пишется шаблон.
Как можно решить проблему?
Может можно обойтись без второго контрола и задать шаблон для UgeDrawingCanvas?
Спасибо.

Это сообщение отредактировал(а) Anyone - 1.8.2009, 23:37
PM MAIL   Вверх
Anyone
Дата 1.8.2009, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Я там не правильно написал, но с изменениями все равно не работает:
Код

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            UgeDrawingCanvas ugeDrawingCanvas = GetTemplateChild("PART_DrawingCanvas") as UgeDrawingCanvas;
            if (ugeDrawingCanvas!=null)
            {
                ScrollBar scrollBarVertical = GetTemplateChild("PART_ScrollBarVertical") as ScrollBar;
                ScrollBar scrollBarHorisontal = GetTemplateChild("PART_ScrollBarHorisontal") as ScrollBar;
                if (scrollBarVertical != null)
                {
                    Binding binding = new Binding("Value");
                    binding.Source = scrollBarVertical;
                    binding.Mode = BindingMode.TwoWay;
                    ugeDrawingCanvas.SetBinding(UgeDrawingCanvas.ScrollOffsetYProperty, binding);
                }
            }
        } 


PM MAIL   Вверх
Anyone
Дата 2.8.2009, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Все, привязка работает, нужно было изменить свойства самого скролла.
Но остается открытым вопрос как можно обойтись без второго контрола и задать шаблон для UgeDrawingCanvas?
Неужели придется оформлять второй контрол как оберку первого и повторить некоторые свойства для TemplateBinding?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0426 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.