2017-02-18 17 views
0

Как применить стиль ко всем дочерним элементам, которые основаны на определенном настраиваемом элементе управления. CustomControlПрименить стиль к элементам управления, которые производятся от определенного базового класса

public class SubView : UserControl 
{ ... } 

Контрольную

Пример

базирующийся на CustomControl

public partial class MyView : SubView 
{ ... } 

XAML для MyView

<myLibrary:SubView 
    xmlns:myLibrary="...."> 

<Grid> 
    <!--Any content--> 
</Grid> 
</moduleChrome:SubView> 

Родитель (дети этой сетки устанавливается из кода во время выполнения)

<Grid> 
    <Grid.Resources> 
     <Style TargetType="myLibrary:SubView"> 
      <Setter Property="MyCustomDependancy" Value="{binding to a shared MyCustomDependancy}"/> 
     </Style> 
    </Grid.Resources> 

    <myLibrary:SubView/> <!--This will have the shared MyCustomDependancy--> 
    <localFolder:MyView/> <!--But this will not be affected--> 
</Grid> 

Как бы сделать, чтобы позволить MyView зависеть от стиля?

EDIT

Происхождение этого кода является динамичным и довольно сложным, но я пытался сделать вопрос, как родовой, как можно так, как многие люди, насколько это возможно мог бы помочь возможным решением, но я думаю, Я сделал это слишком общим. Мне, вероятно, не помогут эти ответы, но я надеюсь, что кто-то еще это сделает.

+0

Какой ответ вы ищете тогда? Почему dont't создать реальный пользовательский элемент управления, если это то, что вы хотите? – mm8

+0

@ mm8 Это «реальный» пользовательский элемент управления. SubView - это замена пользовательских элементов управления внутри другого настраиваемого элемента управления под названием «Вид», а те, которые находятся в «главном» элементе управления, называются «ViewHost».И «Views», и «SubViews» имеют класс зависимостей, называемый ViewGate (который позволяет общаться между представлениями и основным приложением). Что я хотел сделать, это связать ViewGate «View» с его дочерними (SubViews) ViewGates поскольку у ViewGate есть динамические свойства – HGBRD

+0

Итак, как это связано с вашим первоначальным вопросом о том, как применяется стиль базового класса? – mm8

ответ

1

Это действительно будет работать, как ожидалось, при условии, что SubView действительно является контроль пользовательские, а не UserControl и имеет шаблон по умолчанию, определенный в Themes/Generic.xaml.

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

Темы/Generic.xaml:

<Style TargetType="local:SubView"> 
    <Setter Property="Opacity" Value="0.5" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:SubView}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> 
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

управления:

public class SubView : ContentControl 
{ 
    static SubView() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(SubView), 
      new FrameworkPropertyMetadata(typeof(SubView))); 
    } 
} 

public class MyView : SubView 
{ 

} 

Использование:

<local:SubView> 
    <local:SubView.Content> 
     <TextBlock>content 1</TextBlock> 
    </local:SubView.Content> 
</local:SubView> 
<local:MyView> 
    <local:SubView.Content> 
     <TextBlock>content 2</TextBlock> 
    </local:SubView.Content> 
</local:MyView> 

Из MSDN: «Если вам нужно создать новый элемент управления, самый простой способ - создать класс, который происходит из UserControl. Перед тем, как сделать так, считайте, что ваш контроль не будет поддерживать шаблоны и, следовательно, не будет поддерживать сложные настройки.»

https://msdn.microsoft.com/en-us/library/system.windows.controls.usercontrol(v=vs.110).aspx

1

Стили применяются только к определенному классу, они не наследуются. Вы можете сделать это, хотя:

<Style TargetType="{x:Type myLibrary:SubView}"> 
    <Setter Property="Opacity" Value="0.5"/> 
</Style> 
<Style TargetType="{x:Type localFolder:MyView}" BasedOn="{StaticResource {x:Type myLibrary:SubView}} /> 

 Смежные вопросы

  • Нет связанных вопросов^_^