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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как использовать свойства UserControl? 
:(
    Опции темы
dazy
Дата 3.4.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если я делаю контрол и наследую его от UsesrControl, то по умолчанию он имеет множество различных свойств.
Как ими пользоваться? Например как правильно воспользоваться свойством Foreground, чтобы не создавать свой аналог этого свойства?

PM MAIL   Вверх
Idsa
Дата 3.4.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

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



Ничего особенного в их использовании, на мой взгляд, нет. Возьмем вышеуказанное свойство Foreground. Идем в MSDN. Видим, что это Dependency property со следующими флагами: AffectsRender, SubPropertiesDoNotAffectRender, Inherits. Значит при выставлении Foreground у UserControl, Foreground дочерних контролов также поменяется (если не прописан явно).


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
dazy
Дата 3.4.2009, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А можно на примере?

Сделал кнопку как UserControl

Код

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    x:Class="TryDP.SQ"
    d:DesignWidth="88" d:DesignHeight="48">

    <Grid x:Name="LayoutRoot">
        <Button Content="Button"/>
    </Grid>
</UserControl>

В самом коде ни чего не пишу.

На страничке пользуюсь этим контролом, выставляю свойства.  Но эффекта нет. Кнопка все равно дефолтная.
Код

<UserControl x:Class="TryDP.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300" xmlns:TryDP="clr-namespace:TryDP" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
    <Grid x:Name="LayoutRoot" Background="White">
     <TryDP:SQ  Margin="80,32,0,0" Height="48" Width="88" Foreground="#FFFF0000" Background="#FFB64B4B" BorderBrush="#FF7D4444"/>
    </Grid>
</UserControl>


Что у меня не так?

Добавлено через 4 минуты и 59 секунд
Еще вопрос.

А если я в контрол вставляю объект у которого нет такого свойства как у UserControl. Например эллипс. У него есть свойство Fill. 
Как проще всего сделать, чтобы изменяя свойство Foreground у UserControl, у эллипса менялось Fill?

PM MAIL   Вверх
rooks
Дата 3.4.2009, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вы же выставляете свойства UserControl-у а не кнопке. Чтобы менять свойства кнопки можно биндить их на свойства UserControl-а.
PM MAIL ICQ   Вверх
dazy
Дата 3.4.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(rooks @ 3.4.2009,  18:42)
Вы же выставляете свойства UserControl-у а не кнопке. Чтобы менять свойства кнопки можно биндить их на свойства UserControl-а.

Да, это я понимаю.
У меня вопрос как это сделать!

PM MAIL   Вверх
rooks
Дата 3.4.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



в данном примере можно вот так
Код
<UserControl ... Name="p">
    <Grid x:Name="LayoutRoot">
        <Button Background="{Binding Path=Background,ElementName=p}" 
                Foreground="{Binding Path=Foreground,ElementName=p}" Content="Button"/>
    </Grid>
</UserControl>
ну и остальные свойства аналогично

или так
Код
        <Button DataContext="{Binding ElementName=p}" 
                Background="{Binding Background}"  
                Foreground="{Binding Foreground}" Content="Button"/>


Это сообщение отредактировал(а) rooks - 3.4.2009, 16:04
PM MAIL ICQ   Вверх
dazy
Дата 3.4.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это наверное для сильверлайта 3 да? У меня на ElementName ругается, говорит не могу узнать слово ))))
PM MAIL   Вверх
rooks
Дата 3.4.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



это для WPF, как для сильверлайта не знаю...
PM MAIL ICQ   Вверх
dazy
Дата 7.4.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Еще раз подниму вопрос надеясь на мировой опыт:

Я могу только переопределить, т.е. по факту написать свое свойство для юзерконтрола:

Код

        public new Brush Foreground // ключевое слово new, так как у Юзерконтрола уже есть такое свойство как Foreground
       //С таким же успехом я бы мог сделать и свойство MyBrush, и точно так же пользоваться им. 

        {
            get { return (Brush)GetValue(ForegroundProperty); }
            set { SetValue(ForegroundProperty, value); }
        }
        public new static readonly DependencyProperty ForegroundProperty =
            DependencyProperty.Register("Foreground", typeof(Brush), typeof(LightControl),
            new PropertyMetadata(null, OnForegroundChanged));

        private static void OnForegroundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ((LightControl)d).OnForegroundChanged(e);
        }

        protected virtual void OnForegroundChanged(DependencyPropertyChangedEventArgs e)
        {
            //Все что я делаю, это передаю в Fill новую кисть.
            Color.Fill = (Brush) e.NewValue; 
        }


Все что я делаю выше, это передаю в Fill новую кисть. Но это не очень здорово использовать кодбихайнд для привязки, да.
1. Можно ли сделать тоже самое, т.е. использовать стандартное свойство Foreground, чтобы менять цвет у вложенных объектов, без переопределения Foreground? Т.е. можно ли как то подключиться к event'у который срабатывает при изменении свойства?

2. Как можно тоже самое сделать чрез замл? 

Есть простенький контрол:
Код

<UserControl
xmlns= ....
x:Class="TrafficLight.LightControl">
<Grid x:Name="LayoutRoot">
<Grid x:Name="Light" >
  <Ellipse  x:Name="Color" Fill="{Что должно быть здесь, чтобы сюда попало значение Foreground?}" Stroke="#FF000000" />
  <Ellipse  x:Name="Shade" Fill="#E4555555" />
</Grid>
</Grid>


Чтобы потом можно было пользоваться этим Юзерконтролом на страничке таким образом:

Код

<TrafficLight:LightControl x:Name="red" Foreground="#FFFEF100"  --- я хочу чтобы это свойство отвечало за цвет моего UserControl, за цвет у Color.Filll/>



Любые идеи приветствуются!
Все это про силверлайт  smile 

Это сообщение отредактировал(а) dazy - 7.4.2009, 14:54
PM MAIL   Вверх
-Mikle-
Дата 7.4.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Попробуйте вот так, вроде для Silverlight тоже должно работать (для десктоп приложений работает):
Код

            <Ellipse  x:Name="Color" Fill="{Binding Foreground, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}" Stroke="#FF000000" />



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
dazy
Дата 7.4.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



К сожалению SL2 не поддерживает RelativeSource smile 
PM MAIL   Вверх
-Mikle-
Дата 7.4.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



а ControlTemplate и TemplateBinding поддерживает?
если да, то дам пример.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
dazy
Дата 7.4.2009, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вроде да, поддерживает.

ElementName - нет.

PM MAIL   Вверх
-Mikle-
Дата 7.4.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Тогда советую либо вообще отказаться от UserControl и сделать так:
Код

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:l="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <ControlTemplate x:Key="myEllipses" TargetType="Button">
            <Grid>
                <Ellipse  x:Name="Color" Fill="{TemplateBinding Foreground}" Stroke="#FF000000" />
                <Ellipse  x:Name="Shade" Fill="#E4555555" />
            </Grid>
        </ControlTemplate>
    </Window.Resources>
....................................
......................
...........................
        <Button Foreground="Blue" Template="{StaticResource myEllipses}" />
.................
........................
..........


либо сделать вот так:
Код

<UserControl x:Class="WpfApplication1.LightControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <UserControl.Template>
        <ControlTemplate TargetType="Control">
            <Grid>
                <Ellipse  x:Name="Color" Fill="{TemplateBinding Foreground}" Stroke="#FF000000" />
                <Ellipse  x:Name="Shade" Fill="#E4555555" />
            </Grid>
        </ControlTemplate>
    </UserControl.Template>
</UserControl>


Но что-то мне подсказывает, что в сильверлайте есть таки некий готовый Binding либо его подходящие свойства... уж слишком тривиальная задача, и делать так как я предложил, это мне кажется как через ж**у...  smile 


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
dazy
Дата 7.4.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



WPF решения не работают.

Во-первых, в СЛ binding действительно кастрированный до предела. Может с выходом 3й версии ситуация изменится.
Во-вторых, похоже, что UserControl, это какое-то половинчатое решение. И чтобы делать более-менее приличный контрол, надо наследоваться от Control. 

Как я понял, при работе с UC, единственный возможный путь биндить свойство на отображение контрола это внутри кода DP.
Чтобы биндить свойство внутри замл, нужно наследоваться от Control, и создавать шаблон, там можно и биндить. 
Так что придется переходить в на использование Control, или забить на замл, и все делать из кода. Или кто-то все же подскажет решение. Но я уже сомневаюсь, что оно вообще существует. По крайней мере во 2й версии СЛ.  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




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


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

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