app.xaml にリンクされているリソース ディクショナリにあるスタイルを使用するカスタム コントロールがあります。リンクを外して、コントロールを含むページへのリンクを追加すると、機能しません。何故ですか?コントロール (dll) が、コントロールが含まれているページだけでなく、app.xaml にスタイルを含める必要があるのはなぜですか?
2 に答える
コントロール(dll)で、コントロールが含まれているページだけでなく、app.xamlにスタイルを含める必要があるのはなぜですか?
カスタムコントロールにはデフォルトのスタイルが必要です。このデフォルトのスタイルは、コンストラクター内で設定されます。例えば:
public CustomControl()
{
DefaultStyleKey = typeof(CustomControl);
}
これが設定されると、このスタイルの包含アセンブリ内を検索します。コントロールがアプリケーション内にある場合は、App.xaml内にあります。コントロールがクラスライブラリ内にある場合は、ファイルGeneric.xaml内を検索します。このファイルは、フォルダー「Themes」内に配置する必要があります。これらのファイルのいずれかにスタイルを配置する必要はありません。スタイルを含む別のファイルを作成し、App.xamlまたはThemes / Generic.xaml(コントロールが定義されている場所に基づく)から参照できます。これを行うには、これらのファイルの1つにMergedDictionaryを作成します。コントロールがアプリケーションで定義されている場合は、
<Application x:Class="MyApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!--Application Resources-->
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Controls/CustomControl.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
<Application.Resources>
</Application>
コントロールがクラスライブラリ内で定義されている場合、Themes/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="/My.Custom.Assembly;component/FolderLocationOfXaml/CustomControl.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
カスタムコントロールがどこに配置されていても、このためのxamlは常に同じように見えます
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:My.Custom.Assembly.Controls">
<Style TargetType="local:CustomControl">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:CustomControl">
<Grid>
<! -- Other stuff here -->
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
このデフォルトのスタイルが定義されていないと、オーバーライドするスタイルを決定する方法がありません。デフォルトのスタイルを定義したら、アプリ内またはコントロールが使用されている他の場所でスタイルを変更できます。
スタイルをコントロールに移動して、コントロールがディクショナリの項目を使用するために必要なすべての参照が配置されていることを確認してください。UserControl を含むプロジェクトに、リソース ディクショナリを含むプロジェクトへの参照があることを確認してください。ディクショナリへのソース パスを確認します。
<ResourceDictionary Source="/AssemblyName;component/StylesFolderName/ResourceDictionaryName.xaml" />