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

Имеется customcontrol наследуемый от textbox, называется maskedtextbox. Переопределен template, в template добавлена кнопка очистки содержимого textboxa, получился textbox с кнопкой. Далее, создаю еще customcontrol, назовем его searchtextbox и наследуюсь от maskedtextbox. Необходимо в template этого контрола добавить несколько кнопок и картинку, как это сделать с сохранением template maskedtextboxа и функционала? Usercontrol не интересует. Спасибо!
...
Рейтинг: 0 / 0
Custom control template
    #38080691
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
Custom control template
    #38080873
Jack90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лесбияночка, спасибо за решение, но как же с триггерами темплейта для кнопок, например невидимость кнопки очистки при пустом текстбоксе, писать реализацию в процедурном коде не хотелось бы. Да и создавать контролы в проц. коде - это не вариант для wpf. Есть ли еще варианты решения?
...
Рейтинг: 0 / 0
Custom control template
    #38081027
Jack90Лесбияночка, спасибо за решение, но как же с триггерами темплейта для кнопок, например невидимость кнопки очистки при пустом текстбоксе, писать реализацию в процедурном коде не хотелось бы. Да и создавать контролы в проц. коде - это не вариант для wpf. Есть ли еще варианты решения?

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

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

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

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

Я позже набросаю примерчик, может быть. Сейчас не могу пьяненькая чуть чуть.
...
Рейтинг: 0 / 0
Custom control template
    #38081172
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
Custom control template
    #38081201
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неплохо, но есть косяки
авторНапример можно сделать так, чтобы автоматом не генерить контролы, а использовать только ControlTemplate. Наследуется только логика, вид у каждого свой.


Для этого должен быть ContentPresenter в шаблоне, а его нет. Делать подобные конструевины имеет смысл только, если необходим набор кнопок с фиксированным набором действий. В общем варианте можно обойтись ContentControl'ом без всякого наследования, задав нужный template для него
...
Рейтинг: 0 / 0
Custom control template
    #38081222
Jack90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лесбияночка, спасибо за наглядный пример, так и сделаю.
...
Рейтинг: 0 / 0
Custom control template
    #38081224
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
Custom control template
    #38081268
Jack90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лесбияночка, а чем Вы выдрали исходник, если это конечно не секрет?
...
Рейтинг: 0 / 0
Custom control template
    #38081285
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jack90, Expression Blend
...
Рейтинг: 0 / 0
Custom control template
    #38081295
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лесбияночка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
Custom control template
    #38081302
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaМолодец, после многих собеседований могу тебе с уверенностью сказать, что переопределить шаблон могут очень немногие мальчики.
Ты это серьезно?
...
Рейтинг: 0 / 0
Custom control template
    #38081303
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDUARD SAPOTSKISeVaМолодец, после многих собеседований могу тебе с уверенностью сказать, что переопределить шаблон могут очень немногие мальчики.
Ты это серьезно?

Вполне.
...
Рейтинг: 0 / 0
Custom control template
    #38081305
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaВполне.
Надо значит цены повышать!
...
Рейтинг: 0 / 0
Custom control template
    #38081352
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
Custom control template
    #38081354
SeVaEDUARD SAPOTSKIпропущено...

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

Вполне.

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

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

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


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