我有一个WPF自定义控件项目,我希望在其中有许多自定义控件。默认情况下,VS2015 cummunity创建一个Theme文件夹,其中包含generic.xaml文件和带有交互逻辑的.cs文件。
我想要有很多用户控件,所以我尝试创建一个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文件中,则可以正常工作。
所以,在sumary中,我想知道如何拥有一个包含许多自定义控件的库。
感谢。
答案 0 :(得分: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)));
}
}
}