Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 Custom control template  [new]
Jack90
Guest
Здравствуйте!

Имеется customcontrol наследуемый от textbox, называется maskedtextbox. Переопределен template, в template добавлена кнопка очистки содержимого textboxa, получился textbox с кнопкой. Далее, создаю еще customcontrol, назовем его searchtextbox и наследуюсь от maskedtextbox. Необходимо в template этого контрола добавить несколько кнопок и картинку, как это сделать с сохранением template maskedtextboxа и функционала? Usercontrol не интересует. Спасибо!
14 дек 12, 03:59    [13629659]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
Лесбияночка
Guest
Jack90
Usercontrol не интересует.


CustomControl1
    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
        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)
<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
<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>
15 дек 12, 20:33    [13637203]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
Jack90
Guest
Лесбияночка, спасибо за решение, но как же с триггерами темплейта для кнопок, например невидимость кнопки очистки при пустом текстбоксе, писать реализацию в процедурном коде не хотелось бы. Да и создавать контролы в проц. коде - это не вариант для wpf. Есть ли еще варианты решения?
16 дек 12, 03:24    [13638119]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
Лесбияночка
Guest
Jack90
Лесбияночка, спасибо за решение, но как же с триггерами темплейта для кнопок, например невидимость кнопки очистки при пустом текстбоксе, писать реализацию в процедурном коде не хотелось бы. Да и создавать контролы в проц. коде - это не вариант для wpf. Есть ли еще варианты решения?


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

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

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

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

Я позже набросаю примерчик, может быть. Сейчас не могу пьяненькая чуть чуть.
16 дек 12, 15:17    [13638790]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
Лесбияночка
Guest
Jack90,

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

Themes\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: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
+
    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
+
    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
+
<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>
16 дек 12, 20:39    [13639666]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
SeVa
Member [заблокирован]

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


Для этого должен быть ContentPresenter в шаблоне, а его нет. Делать подобные конструевины имеет смысл только, если необходим набор кнопок с фиксированным набором действий. В общем варианте можно обойтись ContentControl'ом без всякого наследования, задав нужный template для него
16 дек 12, 21:23    [13639819]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
Jack90
Guest
Лесбияночка, спасибо за наглядный пример, так и сделаю.
16 дек 12, 21:58    [13639983]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
Лесбияночка
Guest
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

+
<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">
[b]              <ScrollViewer Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />[/b]
            </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>
16 дек 12, 21:59    [13639989]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
Jack90
Guest
Лесбияночка, а чем Вы выдрали исходник, если это конечно не секрет?
16 дек 12, 23:04    [13640155]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
EDUARD SAPOTSKI
Member

Откуда:
Сообщений: 2371
Jack90, Expression Blend
16 дек 12, 23:27    [13640207]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
Лесбияночка
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

+
+
<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">
[b]              <ScrollViewer Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />[/b]
            </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.
Молодец, после многих собеседований могу тебе с уверенностью сказать, что переопределить шаблон могут очень немногие мальчики.
16 дек 12, 23:38    [13640234]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
EDUARD SAPOTSKI
Member

Откуда:
Сообщений: 2371
SeVa
Молодец, после многих собеседований могу тебе с уверенностью сказать, что переопределить шаблон могут очень немногие мальчики.

Ты это серьезно?
16 дек 12, 23:47    [13640247]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
EDUARD SAPOTSKI
SeVa
Молодец, после многих собеседований могу тебе с уверенностью сказать, что переопределить шаблон могут очень немногие мальчики.

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


Вполне.
16 дек 12, 23:51    [13640254]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
EDUARD SAPOTSKI
Member

Откуда:
Сообщений: 2371
SeVa
Вполне.

Надо значит цены повышать!
16 дек 12, 23:53    [13640256]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
Лесбияночка
Guest
Jack90
Лесбияночка, а чем Вы выдрали исходник, если это конечно не секрет?


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

            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, А как это сделать в бленде?
17 дек 12, 01:58    [13640562]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
Лесбияночка
Guest
SeVa
EDUARD SAPOTSKI
пропущено...

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


Вполне.


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

Как считаете, не выпилит ли MS WPF в следующем релизе студии и не обьявит ли depricated? А то у меня попоболь от HTML5/JS. %)
17 дек 12, 02:03    [13640569]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
EDUARD SAPOTSKI
Member

Откуда:
Сообщений: 2371
Лесбияночка
Как считаете, не выпилит ли MS WPF в следующем релизе студии и не обьявит ли depricated? А то у меня попоболь от HTML5/JS. %)

Не поверишь, но здесь у многих нестояк на HTML5/JS после XAML/C#
А на счет deprecated ответ - ХЗ, если MS на Silverlight уже забила, то перспективы у классического десктопа ваще печальные, но это в теории, а на практике делфисты вон до сих пор еще живы
Да и это мы здесь такие умные что шарп уже хороним, народ который подальше от IT только узнавать про него начинает :))
17 дек 12, 08:37    [13640740]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
EDUARD SAPOTSKI
Member

Откуда:
Сообщений: 2371
Лесбияночка
EDUARD SAPOTSKI, А как это сделать в бленде?

ПКМ по нужному контролу -> Edit Template -> Edit Copy
17 дек 12, 09:05    [13640806]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
Лесбияночка

Как считаете, не выпилит ли MS WPF в следующем релизе студии и не обьявит ли depricated? А то у меня попоболь от HTML5/JS. %)


Им, тогда саму студию забанить придется, тк она на wpf ;-)
17 дек 12, 09:19    [13640851]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
Как я понял, default style в WPF (в отличие от SL) зависит от ОС - Control Styles and Templates (там же можно скачать все Default WPF Themes). Печально то, что, например, для Вин7 уже ничего не делалось, развитие остановилось на уровне Висты (((
17 дек 12, 11:47    [13641627]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6036
LR
Как я понял, default style в WPF (в отличие от SL) зависит от ОС

Его вполне можно заоверрайдить на нужную тему: http://arbel.net/2006/11/03/forcing-wpf-to-use-a-specific-windows-theme/
17 дек 12, 11:56    [13641679]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
default'тные весьма унылы. В сети полно тем в том числе и в стиле Метро:
MahApps.Metro,elysium
Metro-Styles-for-WPF.
Порт Sl'овских и тд
17 дек 12, 13:05    [13642204]     Ответить | Цитировать Сообщить модератору
 Re: Custom control template  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
SeVa
default'тные весьма унылы. В сети полно тем в том числе и в стиле Метро:
MahApps.Metro,elysium
Metro-Styles-for-WPF.
Порт Sl'овских и тд
И DataGrid в этих скинах представлен?
17 дек 12, 13:10    [13642232]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить