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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Custom Control от ScrollViewer, проблема binding DependencyProperties 
:(
    Опции темы
Geniy00
Дата 10.11.2011, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброе утро.

У меня проблема с WPF
Хочу создать Custom Control от ScrollViewer, со свойством зависимости VerticalOffset(для программного скроллинга)

У меня все компилируется, но ExtendedScrollViewer не хочет прокручиваться через свойство зависимости.
(для теста я свойство зависимости устанавливаю в коде MainWindow.xaml)

Помогите разобраться, почему не работает?

Структура проекта:
user posted image

ExtendedScrollViewer.cs
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using CustomControlLibrary;

namespace CustomControlLibrary
{    
    public class ExtendedScrollViewer : ScrollViewer
    {
        static ExtendedScrollViewer()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ExtendedScrollViewer), new FrameworkPropertyMetadata(typeof(ExtendedScrollViewer)));
        }
               
        public double VerticalOffset
        {
            get { return (double)GetValue(VerticalOffsetProperty); }
            set { SetValue(VerticalOffsetProperty, value); }
        }

        public static readonly DependencyProperty VerticalOffsetProperty = DependencyProperty.Register(
            "VerticalOffset", 
            typeof(double),
            typeof(ExtendedScrollViewer),
            new FrameworkPropertyMetadata((double)0.0,
                new PropertyChangedCallback(OnVerticalOffsetChanged)));
                

        private static void OnVerticalOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var viewer = (ExtendedScrollViewer)d; 
            viewer.ScrollToVerticalOffset((double)e.NewValue);
        }
    }
}



Generic.xaml
Код

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:CustomControlLibrary">
    
    <Style TargetType="{x:Type local:ExtendedScrollViewer}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:ExtendedScrollViewer}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <ScrollViewer
                            Content="{TemplateBinding Content}">
                            
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    
</ResourceDictionary>


MainWindow.xaml
Код

<Window x:Class="ControlApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:CustomControlLibrary;assembly=CustomControlLibrary"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <local:ExtendedScrollViewer VerticalOffset="200">
            <ListBox FontSize="70">
                <ListBoxItem Content="first" Margin="20" />
                <ListBoxItem Content="second" Margin="20" />
                <ListBoxItem Content="third" Margin="20" />
                <ListBoxItem Content="four" Margin="20" />
                <ListBoxItem Content="five" Margin="20" />
            </ListBox>
        </local:ExtendedScrollViewer>
    </Grid>
</Window>



Это сообщение отредактировал(а) Geniy00 - 10.11.2011, 13:01
PM MAIL   Вверх
Gvozdin
Дата 10.11.2011, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

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



А если напрямую дернуть ScrollToVerticalOffset в MainWindow.OnLoad?
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
Geniy00
Дата 10.11.2011, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Gvozdin @ 10.11.2011,  13:58)
А если напрямую дернуть ScrollToVerticalOffset в MainWindow.OnLoad?


Ничего не произошло тоже. 
Я сделал так, то что ты просил:
Код

<Window x:Class="ControlApplication.MainWindow"
        ....
        Loaded="Window_Loaded"
        .....

       <local:ExtendedScrollViewer x:Name="myScrollViewer" VerticalOffset="200">

Код

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    myScrollViewer.ScrollToVerticalOffset(100);
}

PM MAIL   Вверх
Gvozdin
Дата 10.11.2011, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

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



Странно почему в Load не срабатывает это все.

Дело может быть в том, что VerticalOffset устанавливается слишком рано, до того как все готово к работе.

А если заменить ExtendedScrollViewer на простой ScrollViewer, и ScrollTo вызвать через Dispatcher.BeginInvoke(Background)?
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
Gvozdin
Дата 10.11.2011, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

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



А вот зачем переопределять шаблон скроллера?

Код

    <Style TargetType="{x:Type local:ExtendedScrollViewer}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:ExtendedScrollViewer}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <ScrollViewer
                            Content="{TemplateBinding Content}">
                            
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


Зачем внутрь ScrollViewer пихать ScrollViewer?
Конечно ничего скролить не будет, тк внутренний ScrollViewer ни кто не трогает.

Ну если уж хочется что-то поменять, то можно взять шаблон по умолчанию в Бленде:

Код

        <ControlTemplate x:Key="ScrollViewerControlTemplate1" TargetType="{x:Type ScrollViewer}">
            <Grid x:Name="Grid" Background="{TemplateBinding Background}">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <Rectangle x:Name="Corner" Grid.Column="1" Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" Grid.Row="1"/>
                <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" CanHorizontallyScroll="False" CanVerticallyScroll="False" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Grid.Column="0" Margin="{TemplateBinding Padding}" Grid.Row="0"/>
                <ScrollBar x:Name="PART_VerticalScrollBar" AutomationProperties.AutomationId="VerticalScrollBar" Cursor="Arrow" Grid.Column="1" Maximum="{TemplateBinding ScrollableHeight}" Minimum="0" Grid.Row="0" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}"/>
                <ScrollBar x:Name="PART_HorizontalScrollBar" AutomationProperties.AutomationId="HorizontalScrollBar" Cursor="Arrow" Grid.Column="0" Maximum="{TemplateBinding ScrollableWidth}" Minimum="0" Orientation="Horizontal" Grid.Row="1" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/>
            </Grid>
        </ControlTemplate>


Это сообщение отредактировал(а) Gvozdin - 10.11.2011, 22:37
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
Geniy00
Дата 10.11.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Gvozdin
Спасибо Вам, очень помогли. Теперь работает.
1)Я вижу Вы хорошо разбираетесь в этом всем, какие книги по WPF стоило бы прочитать?
(А то макдональд очень плохо рассказывает, а Адам Нетхен не всегда хорошо понимается на англ. языке)

2)Скажите, а есть какая то разметка что бы избежать предупреждения:
Warning    *** hides inherited member **. Use the new keyword if hiding was intended.    


Нужно было сделать так просто:
Generic.xaml
Код

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:CustomControlLibrary">
    
    <Style TargetType="{x:Type local:ExtendedScrollViewer}">
        <Setter Property="Template">
            <Setter.Value>       
                <ControlTemplate TargetType="{x:Type local:ExtendedScrollViewer}">
                    <Grid x:Name="Grid" Background="{TemplateBinding Background}">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <Rectangle x:Name="Corner" Grid.Column="1" Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" Grid.Row="1"/>
                        <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" CanHorizontallyScroll="False" CanVerticallyScroll="False" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Grid.Column="0" Margin="{TemplateBinding Padding}" Grid.Row="0"/>
                        <ScrollBar x:Name="PART_VerticalScrollBar" AutomationProperties.AutomationId="VerticalScrollBar" Cursor="Arrow" Grid.Column="1" Maximum="{TemplateBinding ScrollableHeight}" Minimum="0" Grid.Row="0" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}"/>
                        <ScrollBar x:Name="PART_HorizontalScrollBar" AutomationProperties.AutomationId="HorizontalScrollBar" Cursor="Arrow" Grid.Column="0" Maximum="{TemplateBinding ScrollableWidth}" Minimum="0" Orientation="Horizontal" Grid.Row="1" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    
</ResourceDictionary>


PM MAIL   Вверх
Gvozdin
Дата 11.11.2011, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

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



Книги не знаю, общие моменты можно прочесть в любой. Далее разбираться конкретно с отдельными вещами, в интернете масса всего написано.

"Use the new keyword if hiding was intended." - все собственно сказано, это уже про C#
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




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


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

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