2016-09-22 5 views
1

많은 사용자 지정 컨트롤이 필요한 WPF 사용자 지정 컨트롤 프로젝트가 있습니다. 기본적으로 VS2015 cummunity는 generic.xaml 파일과 상호 작용 논리가있는 .cs 파일이있는 Theme 폴더를 만듭니다.동일한 라이브러리에서 많은 wpf 사용자 정의 컨트롤을 사용하는 방법은 무엇입니까?

많은 사용자 컨트롤이 필요하므로이 폴더 안에 MyControl1 폴더를 만들려고했습니다. 테마 폴더를 만들고 WPF 사용자 지정 컨트롤을 새 항목으로 추가했습니다. 그러나이 컨트롤에 대한 generic.xaml을 만들지는 않습니다. 루트 폴더에서 기본 generic.xaml을 복사하고 스타일을 만들지 만 WPF 응용 프로그램에서 컨트롤을 사용할 때 컨트롤이 표시되지 않습니다.

나는이 게시물을 보았습니다 : Custom control Lib with multiple controls and generic.xaml하지만 정말 많은 해결책을 이해하지 못합니다.

나는 y는이 코드가 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의는 기본 컨트롤에서 상속하는 경향이있다, 그래서 나는

<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> 

TextBox.xaml 등의 ListView, 텍스트 상자,

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> 

에 의해 그룹에이를 것 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 폴더를 만들어 놓습니다. Themes 폴더에 배치 할 수 있습니다. 병합 된 사전에 정의 된 경로 만 변경하면됩니다. –