Re: [WPF] Пример контрола с изменяемой частью.
От: notacat  
Дата: 01.12.10 10:47
Оценка: 8 (1)
>Буду благодарен за любую критику/замечания.
А почему именно public static ComponentResourceKey ... ?

Я бы сделала немного по-другому:

public static ComponentResourceKey DefaultHeaderStyleKey;

Из ControlTemplate на этот стиль ссылаться не нужно вообще, его должен находить сам контрол где-нибудь после инициализаци и использовать как дефолтное значение для обычного DependencyProperty HeaderStyle.

В ControlTemplate для задания стиля какой-то части использовать "{Binding HeaderStyle, RelativeSource={RelaticeSource TemplatedParent}}".

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

По-моему, это более стандартный подход, особенно, если надо, чтобы эти контролы много раз использовались. Хотя для одного конкретного приложения — может быть дело вкуса.
Re: [WPF] Пример контрола с изменяемой частью.
От: MxMsk Португалия  
Дата: 01.12.10 08:54
Оценка: 7 (1)
Здравствуйте, Sinix, Вы писали:

S>Буду благодарен за любую критику/замечания.

О! А ведь кажись подобным образом работает ToolBar с его <i>XXX</i>StyleKey. Правда там стиль не автоматом подхватывается, а в ToolBar.PrepareContainerForItemOverride.
[WPF] Пример контрола с изменяемой частью.
От: Sinix  
Дата: 01.12.10 03:14
Оценка: 5 (1)
По мотивам предыдущей
Автор: Sinix
Дата: 30.11.10
темы:



Исходники.

  Для подмены достаточно
<Window x:Class="Sinix.TemplatedPartSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:templated="clr-namespace:Sinix.TemplatedPartControl;assembly=Sinix.TemplatedPartControl"
        Title="MainWindow"
        Height="398"
        Width="293">
  <StackPanel>
    <templated:SomeControl Margin="8" />
    <templated:SomeControl Margin="8">
      <templated:SomeControl.Resources>
        <ControlTemplate x:Key="{x:Static templated:SomeControl.HeaderTemplateKey}"
                         TargetType="Control">
          <Button Content="Changed part"
                  Style="{DynamicResource {x:Static templated:SomeControl.HeaderStyleKey}}" />
        </ControlTemplate>
      </templated:SomeControl.Resources>
    </templated:SomeControl>
    <StackPanel>
      <!-- Подменяемый шаблон можно определить где угодно -->
      <StackPanel.Resources>
        <ControlTemplate x:Key="{x:Static templated:SomeControl.HeaderTemplateKey}"
                         TargetType="Control">
          <CheckBox Content="Changed part - 2" HorizontalAlignment="Left"
                    Style="{DynamicResource {x:Static templated:SomeControl.HeaderStyleKey}}" />
        </ControlTemplate>
      </StackPanel.Resources>
      <templated:SomeControl Margin="8" />
    </StackPanel>
  </StackPanel>
</Window>


Буду благодарен за любую критику/замечания.
Re[2]: [WPF] Пример контрола с изменяемой частью.
От: Sinix  
Дата: 01.12.10 12:13
Оценка:
Здравствуйте, notacat, Вы писали:

N>А почему именно public static ComponentResourceKey ... ?

Почему свойством? Потому что так сделали дизайнеры WPF — посмотрите System.Windows.SystemColors.
Только надо возвращать базовый класс — ResourceKey.

N>Из ControlTemplate на этот стиль ссылаться не нужно вообще, его должен находить сам контрол где-нибудь после инициализаци и использовать как дефолтное значение для обычного DependencyProperty HeaderStyle.

N>В этом случае у человека, который эти контролы вставляет в окно, появляется возможность подменить HeaderStyle для отдельного экземпляра, не вдаваясь в темплейты.

Так и собираюсь, лень было расписывать в сампле.

А вообще-то задача обратная: подменить template, переиспользуя стили. Так что заводить надо свойства HeaderTemplate и HeaderTemplateSelector и биндить их через PriorityBinding.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.