Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Custom control template / 23 сообщений из 23, страница 1 из 1
14.12.2012, 03:59
    #38078786
Jack90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
Здравствуйте!

Имеется customcontrol наследуемый от textbox, называется maskedtextbox. Переопределен template, в template добавлена кнопка очистки содержимого textboxa, получился textbox с кнопкой. Далее, создаю еще customcontrol, назовем его searchtextbox и наследуюсь от maskedtextbox. Необходимо в template этого контрола добавить несколько кнопок и картинку, как это сделать с сохранением template maskedtextboxа и функционала? Usercontrol не интересует. Спасибо!
...
Рейтинг: 0 / 0
15.12.2012, 20:33
    #38080691
Custom control template
Jack90Usercontrol не интересует.

CustomControl1
Код: 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.
    public class CustomControl1 : TextBox
    {
        static CustomControl1()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            var buttonsConteiner = GetTemplateChild("PART_ButtonsHost") as Panel;
            if (buttonsConteiner == null)
                return;

            var myBtn1 = new Button() { Content = "MyBtn1" };
            myBtn1.Click += myBtn1_Click;
            buttonsConteiner.Children.Add(myBtn1);
        }

        void myBtn1_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("CustomControl1.MyBtn1");
        }
    }



CustomControl2
Код: 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.
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            var buttonsConteiner = GetTemplateChild("PART_ButtonsHost") as Panel;
            if (buttonsConteiner == null)
                return;

            var myBtn2 = new Button() { Content = "MyBtn2" };
            myBtn2.Click += myBtn2_Click;
            buttonsConteiner.Children.Add(myBtn2);

            var myBtn3 = new Button() { Content = "MyBtn3" };
            myBtn3.Click += myBtn3_Click;
            buttonsConteiner.Children.Add(myBtn3);
        }

        void myBtn2_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("CustomControl2.MyBtn2");
        }

        void myBtn3_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("CustomControl2.MyBtn3");
        }
    }



Control Template для CustomControl2 (Generic.xaml Theme)
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfCustomControlLibrary2">
    <Style TargetType="{x:Type local:CustomControl1}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                    <StackPanel Orientation="Horizontal">
                        <ScrollViewer x:Name="PART_ContentHost" />
                        <StackPanel x:Name="PART_ButtonsHost" Orientation="Horizontal" />
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>



Использование CustomControl1, CustomControl2
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:jjj="clr-namespace:WpfCustomControlLibrary2;assembly=WpfCustomControlLibrary2"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <jjj:CustomControl1 Text="CustomControl1"></jjj:CustomControl1>
            <jjj:CustomControl2 Text="CustomControl2"></jjj:CustomControl2>
        </StackPanel>
    </Grid>
</Window>
...
Рейтинг: 0 / 0
16.12.2012, 03:24
    #38080873
Jack90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
Лесбияночка, спасибо за решение, но как же с триггерами темплейта для кнопок, например невидимость кнопки очистки при пустом текстбоксе, писать реализацию в процедурном коде не хотелось бы. Да и создавать контролы в проц. коде - это не вариант для wpf. Есть ли еще варианты решения?
...
Рейтинг: 0 / 0
16.12.2012, 15:17
    #38081027
Custom control template
Jack90Лесбияночка, спасибо за решение, но как же с триггерами темплейта для кнопок, например невидимость кнопки очистки при пустом текстбоксе, писать реализацию в процедурном коде не хотелось бы. Да и создавать контролы в проц. коде - это не вариант для wpf. Есть ли еще варианты решения?

В WPF при написании CustomControl'a думают о логике, а о виде в последнюю очередь. Все контролы WPF почти не имеют своего вида, наследуя его из темы.

В случае с CustomControl'ом, принят подход когда в темплейте определяются PART'ы и к ним в OnApplyTemplate пристегиваются обработчики событий например, получаются ссылки на PART'ы чтобы ими манипулировать в соответствии с логикой контрола.

Если хотите относительно декларативно, реакцию на действия пользователя с контролами темплейта можно организовать RoutedCommand'ами. Для которых вам надо на уровне вашего контрооа зарегистрировать InputBinding'и, а контролам темплейта присвоить команды с CommandTarget =TemplatedParent.

А в темплейте указать всякий раз столько кнопок, сколько вам надо снабдив их стилями, триггерами, и т. п..

Я позже набросаю примерчик, может быть. Сейчас не могу пьяненькая чуть чуть.
...
Рейтинг: 0 / 0
16.12.2012, 20:39
    #38081172
Custom control template
Jack90,

Например можно сделать так, чтобы автоматом не генерить контролы, а использовать только ControlTemplate. Наследуется только логика , вид у каждого свой.

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.
28.
29.
30.
31.
32.
33.
34.
35.
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfCustomControlLibrary1">
    <Style TargetType="{x:Type local:CustomControl1}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                    <StackPanel Orientation="Horizontal">
                        <ScrollViewer x:Name="PART_ContentHost" />
                        <StackPanel Orientation="Horizontal">
                            <Button Command="{x:Static local:CustomControl1.MyCommand1}" Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}" />
                        </StackPanel>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style TargetType="{x:Type local:CustomControl2}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomControl2}">
                    <StackPanel Orientation="Horizontal">
                        <ScrollViewer x:Name="PART_ContentHost" />
                        <StackPanel Orientation="Horizontal">
                            <Button Command="{x:Static local:CustomControl1.MyCommand1}" Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}" />
                            <Button Command="{x:Static local:CustomControl2.MyCommand2}" Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}" />
                            <Button Command="{x:Static local:CustomControl2.MyCommand3}" Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}" />
                        </StackPanel>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>



CustomControl1
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
    public class CustomControl1 : TextBox
    {
        public static RoutedUICommand MyCommand1 =
            new RoutedUICommand("Command1", "MyCommand1", typeof(CustomControl1));

        static CustomControl1()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));

            CommandManager.RegisterClassCommandBinding(typeof(CustomControl1),
                new CommandBinding(MyCommand1, new ExecutedRoutedEventHandler(MyCommand1Handler), new CanExecuteRoutedEventHandler(MyCommand1CanExecute)));
        }

        private static void MyCommand1CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }

        private static void MyCommand1Handler(object sender, ExecutedRoutedEventArgs e)
        {
            MessageBox.Show("Command1");
        }
    }



CustomControl2
Код: 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.
    public class CustomControl2 : CustomControl1
    {
        public static RoutedUICommand MyCommand2 =
            new RoutedUICommand("Command2", "MyCommand2", typeof(CustomControl2));

        public static RoutedUICommand MyCommand3 =
            new RoutedUICommand("Command3", "MyCommand3", typeof(CustomControl2));

        static CustomControl2()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl2), new FrameworkPropertyMetadata(typeof(CustomControl2)));

            CommandManager.RegisterClassCommandBinding(typeof(CustomControl2),
                new CommandBinding(MyCommand2, new ExecutedRoutedEventHandler(MyCommand2Handler), new CanExecuteRoutedEventHandler(MyCommand2CanExecute)));
            CommandManager.RegisterClassCommandBinding(typeof(CustomControl2),
                new CommandBinding(MyCommand3, new ExecutedRoutedEventHandler(MyCommand3Handler), new CanExecuteRoutedEventHandler(MyCommand3CanExecute)));
        }

        private static void MyCommand2CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }

        private static void MyCommand2Handler(object sender, ExecutedRoutedEventArgs e)
        {
            MessageBox.Show("Command2");
        }

        private static void MyCommand3CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }

        private static void MyCommand3Handler(object sender, ExecutedRoutedEventArgs e)
        {
            MessageBox.Show("Command3");
        }
    }



MainWnd.xaml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:qqq="clr-namespace:WpfCustomControlLibrary1;assembly=WpfCustomControlLibrary1"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <qqq:CustomControl1>Editable Text 1</qqq:CustomControl1>
            <qqq:CustomControl2>Editable Text 2</qqq:CustomControl2>
        </StackPanel>
    </Grid>
</Window>

...
Рейтинг: 0 / 0
16.12.2012, 21:23
    #38081201
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
Неплохо, но есть косяки
авторНапример можно сделать так, чтобы автоматом не генерить контролы, а использовать только ControlTemplate. Наследуется только логика, вид у каждого свой.


Для этого должен быть ContentPresenter в шаблоне, а его нет. Делать подобные конструевины имеет смысл только, если необходим набор кнопок с фиксированным набором действий. В общем варианте можно обойтись ContentControl'ом без всякого наследования, задав нужный template для него
...
Рейтинг: 0 / 0
16.12.2012, 21:58
    #38081222
Jack90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
Лесбияночка, спасибо за наглядный пример, так и сделаю.
...
Рейтинг: 0 / 0
16.12.2012, 21:59
    #38081224
Custom control template
SeVaНеплохо, но есть косяки
авторНапример можно сделать так, чтобы автоматом не генерить контролы, а использовать только ControlTemplate. Наследуется только логика, вид у каждого свой.


Для этого должен быть ContentPresenter в шаблоне, а его нет. Делать подобные конструевины имеет смысл только, если необходим набор кнопок с фиксированным набором действий. В общем варианте можно обойтись ContentControl'ом без всякого наследования, задав нужный template для него

На самом деле автору нужен UserControl, но он не хочет, почему не ясно. Я просто предложила пару вариантов с CustomControl'ом...

А по поводу ContentPresenter'a, в ControlTemplat'e темы для контрола, здесь его нет, по скольку базовый класс здесь для всех TextBox (как у автора в условии). А TextBox судя по дереву наследования не Content Control... Потому смысла особого не было в пробрасывании Content'а из TemplatedParent'a в ControlTemplate темы или мы друг друга не поняли.

Здесь использован PART_ContentHost <ScrollViewer x:Name="PART_ContentHost" />. Выбор на ScrollView пал из-за того, что в коробочном DefaultStyle для TextBox'а под именем PART_ContentHost определен именно ScrollViewer. Наверное можно было и что-то другое, судя по доке может быть любой FrameworkElement.

Если интересно вот DefaultStyle для TextBox

Код: 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.
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.
<Style TargetType="TextBox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">
  <Style.BasedOn>
    <Style TargetType="TextBoxBase">
      <Style.Triggers>
        <MultiTrigger>
          <MultiTrigger.Conditions>
            <Condition Property="TextBoxBase.IsInactiveSelectionHighlightEnabled">
              <Condition.Value>
                <s:Boolean>True</s:Boolean>
              </Condition.Value>
            </Condition>
            <Condition Property="TextBoxBase.IsSelectionActive">
              <Condition.Value>
                <s:Boolean>False</s:Boolean>
              </Condition.Value>
            </Condition>
          </MultiTrigger.Conditions>
          <Setter Property="TextBoxBase.SelectionBrush">
            <Setter.Value>
              <DynamicResource ResourceKey="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" />
            </Setter.Value>
          </Setter>
        </MultiTrigger>
      </Style.Triggers>
      <Style.Resources>
        <ResourceDictionary />
      </Style.Resources>
      <Setter Property="TextElement.Foreground">
        <Setter.Value>
          <DynamicResource ResourceKey="{x:Static SystemColors.ControlTextBrushKey}" />
        </Setter.Value>
      </Setter>
      <Setter Property="Panel.Background">
        <Setter.Value>
          <DynamicResource ResourceKey="{x:Static SystemColors.WindowBrushKey}" />
        </Setter.Value>
      </Setter>
      <Setter Property="Border.BorderBrush">
        <Setter.Value>
          <LinearGradientBrush StartPoint="0,0" EndPoint="0,20" MappingMode="Absolute">
            <LinearGradientBrush.GradientStops>
              <GradientStop Color="#FFABADB3" Offset="0.05" />
              <GradientStop Color="#FFE2E3EA" Offset="0.07" />
              <GradientStop Color="#FFE3E9EF" Offset="1" />
            </LinearGradientBrush.GradientStops>
          </LinearGradientBrush>
        </Setter.Value>
      </Setter>
      <Setter Property="Border.BorderThickness">
        <Setter.Value>
          <Thickness>1,1,1,1</Thickness>
        </Setter.Value>
      </Setter>
      <Setter Property="Control.Padding">
        <Setter.Value>
          <Thickness>1,1,1,1</Thickness>
        </Setter.Value>
      </Setter>
      <Setter Property="UIElement.AllowDrop">
        <Setter.Value>
          <s:Boolean>True</s:Boolean>
        </Setter.Value>
      </Setter>
      <Setter Property="FrameworkElement.FocusVisualStyle">
        <Setter.Value>
          <x:Null />
        </Setter.Value>
      </Setter>
      <Setter Property="ScrollViewer.PanningMode">
        <Setter.Value>
          <x:Static Member="PanningMode.VerticalFirst" />
        </Setter.Value>
      </Setter>
      <Setter Property="Stylus.IsFlicksEnabled">
        <Setter.Value>
          <s:Boolean>False</s:Boolean>
        </Setter.Value>
      </Setter>
      <Setter Property="Control.Template">
        <Setter.Value>
          <ControlTemplate TargetType="TextBoxBase">
            <mwt:ListBoxChrome Background="{TemplateBinding Panel.Background}" BorderBrush="{TemplateBinding Border.BorderBrush}" BorderThickness="{TemplateBinding Border.BorderThickness}" RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" RenderFocused="{TemplateBinding UIElement.IsKeyboardFocusWithin}" Name="Bd" SnapsToDevicePixels="True">
              <ScrollViewer Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
            </mwt:ListBoxChrome>
            <ControlTemplate.Triggers>
              <Trigger Property="UIElement.IsEnabled">
                <Setter Property="Panel.Background" TargetName="Bd">
                  <Setter.Value>
                    <DynamicResource ResourceKey="{x:Static SystemColors.ControlBrushKey}" />
                  </Setter.Value>
                </Setter>
                <Setter Property="TextElement.Foreground">
                  <Setter.Value>
                    <DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" />
                  </Setter.Value>
                </Setter>
                <Trigger.Value>
                  <s:Boolean>False</s:Boolean>
                </Trigger.Value>
              </Trigger>
            </ControlTemplate.Triggers>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </Style.BasedOn>
  <Style.Resources>
    <ResourceDictionary />
  </Style.Resources>
</Style>

...
Рейтинг: 0 / 0
16.12.2012, 23:04
    #38081268
Jack90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
Лесбияночка, а чем Вы выдрали исходник, если это конечно не секрет?
...
Рейтинг: 0 / 0
16.12.2012, 23:27
    #38081285
EDUARD SAPOTSKI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
Jack90, Expression Blend
...
Рейтинг: 0 / 0
16.12.2012, 23:38
    #38081295
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
ЛесбияночкаSeVaНеплохо, но есть косяки
пропущено...


Для этого должен быть ContentPresenter в шаблоне, а его нет. Делать подобные конструевины имеет смысл только, если необходим набор кнопок с фиксированным набором действий. В общем варианте можно обойтись ContentControl'ом без всякого наследования, задав нужный template для него

На самом деле автору нужен UserControl, но он не хочет, почему не ясно. Я просто предложила пару вариантов с CustomControl'ом...

А по поводу ContentPresenter'a, в ControlTemplat'e темы для контрола, здесь его нет, по скольку базовый класс здесь для всех TextBox (как у автора в условии). А TextBox судя по дереву наследования не Content Control... Потому смысла особого не было в пробрасывании Content'а из TemplatedParent'a в ControlTemplate темы или мы друг друга не поняли.

Здесь использован PART_ContentHost <ScrollViewer x:Name="PART_ContentHost" />. Выбор на ScrollView пал из-за того, что в коробочном DefaultStyle для TextBox'а под именем PART_ContentHost определен именно ScrollViewer. Наверное можно было и что-то другое, судя по доке может быть любой FrameworkElement.

Если интересно вот DefaultStyle для TextBox

+
Код: 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.
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.
<Style TargetType="TextBox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">
  <Style.BasedOn>
    <Style TargetType="TextBoxBase">
      <Style.Triggers>
        <MultiTrigger>
          <MultiTrigger.Conditions>
            <Condition Property="TextBoxBase.IsInactiveSelectionHighlightEnabled">
              <Condition.Value>
                <s:Boolean>True</s:Boolean>
              </Condition.Value>
            </Condition>
            <Condition Property="TextBoxBase.IsSelectionActive">
              <Condition.Value>
                <s:Boolean>False</s:Boolean>
              </Condition.Value>
            </Condition>
          </MultiTrigger.Conditions>
          <Setter Property="TextBoxBase.SelectionBrush">
            <Setter.Value>
              <DynamicResource ResourceKey="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" />
            </Setter.Value>
          </Setter>
        </MultiTrigger>
      </Style.Triggers>
      <Style.Resources>
        <ResourceDictionary />
      </Style.Resources>
      <Setter Property="TextElement.Foreground">
        <Setter.Value>
          <DynamicResource ResourceKey="{x:Static SystemColors.ControlTextBrushKey}" />
        </Setter.Value>
      </Setter>
      <Setter Property="Panel.Background">
        <Setter.Value>
          <DynamicResource ResourceKey="{x:Static SystemColors.WindowBrushKey}" />
        </Setter.Value>
      </Setter>
      <Setter Property="Border.BorderBrush">
        <Setter.Value>
          <LinearGradientBrush StartPoint="0,0" EndPoint="0,20" MappingMode="Absolute">
            <LinearGradientBrush.GradientStops>
              <GradientStop Color="#FFABADB3" Offset="0.05" />
              <GradientStop Color="#FFE2E3EA" Offset="0.07" />
              <GradientStop Color="#FFE3E9EF" Offset="1" />
            </LinearGradientBrush.GradientStops>
          </LinearGradientBrush>
        </Setter.Value>
      </Setter>
      <Setter Property="Border.BorderThickness">
        <Setter.Value>
          <Thickness>1,1,1,1</Thickness>
        </Setter.Value>
      </Setter>
      <Setter Property="Control.Padding">
        <Setter.Value>
          <Thickness>1,1,1,1</Thickness>
        </Setter.Value>
      </Setter>
      <Setter Property="UIElement.AllowDrop">
        <Setter.Value>
          <s:Boolean>True</s:Boolean>
        </Setter.Value>
      </Setter>
      <Setter Property="FrameworkElement.FocusVisualStyle">
        <Setter.Value>
          <x:Null />
        </Setter.Value>
      </Setter>
      <Setter Property="ScrollViewer.PanningMode">
        <Setter.Value>
          <x:Static Member="PanningMode.VerticalFirst" />
        </Setter.Value>
      </Setter>
      <Setter Property="Stylus.IsFlicksEnabled">
        <Setter.Value>
          <s:Boolean>False</s:Boolean>
        </Setter.Value>
      </Setter>
      <Setter Property="Control.Template">
        <Setter.Value>
          <ControlTemplate TargetType="TextBoxBase">
            <mwt:ListBoxChrome Background="{TemplateBinding Panel.Background}" BorderBrush="{TemplateBinding Border.BorderBrush}" BorderThickness="{TemplateBinding Border.BorderThickness}" RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" RenderFocused="{TemplateBinding UIElement.IsKeyboardFocusWithin}" Name="Bd" SnapsToDevicePixels="True">
              <ScrollViewer Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
            </mwt:ListBoxChrome>
            <ControlTemplate.Triggers>
              <Trigger Property="UIElement.IsEnabled">
                <Setter Property="Panel.Background" TargetName="Bd">
                  <Setter.Value>
                    <DynamicResource ResourceKey="{x:Static SystemColors.ControlBrushKey}" />
                  </Setter.Value>
                </Setter>
                <Setter Property="TextElement.Foreground">
                  <Setter.Value>
                    <DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" />
                  </Setter.Value>
                </Setter>
                <Trigger.Value>
                  <s:Boolean>False</s:Boolean>
                </Trigger.Value>
              </Trigger>
            </ControlTemplate.Triggers>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </Style.BasedOn>
  <Style.Resources>
    <ResourceDictionary />
  </Style.Resources>
</Style>



Wow! Извини, читал по диагонали и не досмотрел, что наследование от TextBox. Это не совсем стандартный вариант и для него, действительно, нужен ScrollView.
Молодец, после многих собеседований могу тебе с уверенностью сказать, что переопределить шаблон могут очень немногие мальчики.
...
Рейтинг: 0 / 0
16.12.2012, 23:47
    #38081302
EDUARD SAPOTSKI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
SeVaМолодец, после многих собеседований могу тебе с уверенностью сказать, что переопределить шаблон могут очень немногие мальчики.
Ты это серьезно?
...
Рейтинг: 0 / 0
16.12.2012, 23:51
    #38081303
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
EDUARD SAPOTSKISeVaМолодец, после многих собеседований могу тебе с уверенностью сказать, что переопределить шаблон могут очень немногие мальчики.
Ты это серьезно?

Вполне.
...
Рейтинг: 0 / 0
16.12.2012, 23:53
    #38081305
EDUARD SAPOTSKI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
SeVaВполне.
Надо значит цены повышать!
...
Рейтинг: 0 / 0
17.12.2012, 01:58
    #38081352
Custom control template
Jack90Лесбияночка, а чем Вы выдрали исходник, если это конечно не секрет?

Не секрет. Вот не большой кусочек говнакода, которым это было сделано.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
            object defaultStyleKey = ddd.GetValue(
                FrameworkElement.DefaultStyleKeyProperty);

            Style style = (Style)Application.Current.FindResource(defaultStyleKey);

            string xaml = System.Windows.Markup.XamlWriter.Save(style);

            ddd.Text = xaml;

            using (System.IO.StreamWriter sw = new System.IO.StreamWriter("c:\\temp\\t.xml"))
            {
                sw.WriteLine(xaml);
            }



EDUARD SAPOTSKI, А как это сделать в бленде?
...
Рейтинг: 0 / 0
17.12.2012, 02:03
    #38081354
Custom control template
SeVaEDUARD SAPOTSKIпропущено...

Ты это серьезно?

Вполне.

Я только изучила WPF. Досконально вроде, кроме 3D и Video,Audio,Speech. При необходимости подтяну и это. Думаю работать по этому профилю начать WPF/WCF/EF. EF хорошенько только подтяну.

Как считаете, не выпилит ли MS WPF в следующем релизе студии и не обьявит ли depricated? А то у меня попоболь от HTML5/JS. %)
...
Рейтинг: 0 / 0
17.12.2012, 08:37
    #38081407
EDUARD SAPOTSKI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
ЛесбияночкаКак считаете, не выпилит ли MS WPF в следующем релизе студии и не обьявит ли depricated? А то у меня попоболь от HTML5/JS. %)
Не поверишь, но здесь у многих нестояк на HTML5/JS после XAML/C#
А на счет depr e cated ответ - ХЗ, если MS на Silverlight уже забила, то перспективы у классического десктопа ваще печальные, но это в теории, а на практике делфисты вон до сих пор еще живы
Да и это мы здесь такие умные что шарп уже хороним, народ который подальше от IT только узнавать про него начинает :))
...
Рейтинг: 0 / 0
17.12.2012, 09:05
    #38081429
EDUARD SAPOTSKI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
ЛесбияночкаEDUARD SAPOTSKI, А как это сделать в бленде?
ПКМ по нужному контролу -> Edit Template -> Edit Copy
...
Рейтинг: 0 / 0
17.12.2012, 09:19
    #38081441
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
Лесбияночка
Как считаете, не выпилит ли MS WPF в следующем релизе студии и не обьявит ли depricated? А то у меня попоболь от HTML5/JS. %)

Им, тогда саму студию забанить придется, тк она на wpf ;-)
...
Рейтинг: 0 / 0
17.12.2012, 11:47
    #38081637
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
Как я понял, default style в WPF (в отличие от SL) зависит от ОС - Control Styles and Templates (там же можно скачать все Default WPF Themes). Печально то, что, например, для Вин7 уже ничего не делалось, развитие остановилось на уровне Висты (((
...
Рейтинг: 0 / 0
17.12.2012, 11:56
    #38081650
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
LRКак я понял, default style в WPF (в отличие от SL) зависит от ОС
Его вполне можно заоверрайдить на нужную тему: http://arbel.net/2006/11/03/forcing-wpf-to-use-a-specific-windows-theme/
...
Рейтинг: 0 / 0
17.12.2012, 13:05
    #38081803
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
default'тные весьма унылы. В сети полно тем в том числе и в стиле Метро:
MahApps.Metro , elysium
Metro-Styles-for-WPF .
Порт Sl'овских и тд
...
Рейтинг: 0 / 0
17.12.2012, 13:10
    #38081812
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Custom control template
SeVadefault'тные весьма унылы. В сети полно тем в том числе и в стиле Метро:
MahApps.Metro , elysium
Metro-Styles-for-WPF .
Порт Sl'овских и тдИ DataGrid в этих скинах представлен?
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Custom control template / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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