2016-09-22 4 views
1

У меня есть проект пользовательского контроля WPF, в котором я хочу иметь множество настраиваемых элементов управления. По умолчанию VS2015 cummunity создает папку Theme с файлом generic.xaml и .cs-файлом с логикой взаимодействия.Как иметь множество пользовательских элементов управления wpf в одной и той же библиотеке?

Я хочу иметь множество пользовательских элементов управления, поэтому я попытался создать папку MyControl1, внутри этой папки я создал папку Theme, и я добавляю новый элемент, настраиваемый элемент управления WPF. Но он не создает generic.xaml для этого элемента управления. Я копирую из корневой папки по умолчанию generic.xaml, и я создаю свой стиль, но когда я использую элемент управления в своем приложении WPF, я не вижу этого элемента управления.

Я видел это сообщение: Custom control Lib with multiple controls and generic.xaml, но на самом деле я не так много понимаю.

У меня есть проблема, в MyControl1.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:CustomControls.Calendario2"> 


    <Style TargetType="{x:Type local:CalendarioMes2}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:CalendarioMes2}"> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 

         <Grid> 
          <TextBox Text="Prueba"/> 
          <Label Content="Prueba"/> 
         </Grid> 

        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

Но я получаю ошибку в этой строке:

<Style TargetType="{x:Type local:CalendarioMes2}"> 

То, что это не возможно создать тип из локального текста: CalendarioMes2.

Если я использую этот код в библиотеке только с одним настраиваемым элементом управления, и этот код находится в файле generic.xaml, он работает.

Итак, в сущности, я хотел бы знать, как мне получить библиотеку со многими настраиваемыми элементами управления.

Спасибо.

ответ

1

Я обнаружил, что самый чистый способ заключается в создании объединенного словаря. CustomControl имеет тенденцию наследоваться от базового управления, так что я буду сгруппировать их по ListView, TextBox и т.д.

Generic.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/YourAssembly;component/ResourceDictionaries/ListView.xaml"/> 
     <ResourceDictionary Source="/YourAssembly;component/ResourceDictionaries/TabControl.xaml"/> 
     <ResourceDictionary Source="/YourAssembly;component/ResourceDictionaries/TextBox.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

TextBox.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:Local="clr-namespace:YourNameSpace"> 

<!-- Describes how to style a ValidatedTextBox --> 
    <Style x:Key="{x:Type Local:ValidatedTextBox}" BasedOn="{StaticResource {x:Type TextBox}}" TargetType="{x:Type Local:ValidatedTextBox}"> 
     <Setter Property="Validation.ErrorTemplate"> 
      <Setter.Value> 
       <ControlTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <Border BorderBrush="Red" BorderThickness="1" VerticalAlignment="Top"> 
          <AdornedElementPlaceholder x:Name="adorner" /> 
         </Border> 
         <Border x:Name="validationErrorsContainer" Background="LightCoral" BorderBrush="Red" BorderThickness="1" Margin="5, 0, 0, 0" VerticalAlignment="Top"> 
          <ListView Background="Transparent" BorderThickness="0" Focusable="False" IsHitTestVisible="False" 
             ItemsSource="{Binding AdornedElement.(Validation.Errors), ElementName=adorner}"> 
           <ListView.Resources> 
            <Style TargetType="{x:Type GridViewColumnHeader}"> 
             <Setter Property="Visibility" Value="Collapsed" /> 
            </Style> 
           </ListView.Resources> 
           <ListView.ItemTemplate> 
            <DataTemplate> 
             <TextBlock Text="{Binding ErrorContent}" /> 
            </DataTemplate> 
           </ListView.ItemTemplate> 
          </ListView> 
         </Border> 
        </StackPanel> 
        <ControlTemplate.Triggers> 
         <DataTrigger Binding="{Binding AdornedElement.IsFocused, ElementName=adorner}" Value="False"> 
          <Setter TargetName="validationErrorsContainer" Property="Visibility" Value="Collapsed" /> 
         </DataTrigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

ValidatedTextBox.cs

namespace YourNameSpace 
{ 
    public class ValidatedTextBox : TextBox 
    { 
     static ValidatedTextBox() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(ValidatedTextBox), new FrameworkPropertyMetadata(typeof(ValidatedTextBox))); 
     } 
    } 
} 
+0

И TextBox.xaml находится в папке темы в корне проекта, в той же папке, что и generic.xaml? –

+1

Я создаю папку ResourceDictionaries в корне проекта и размещаю ее там. Вы можете поместить его в папку «Темы», просто измените путь, определенный в объединенном словаре. –