【发布时间】:2019-10-23 04:33:16
【问题描述】:
我为可重用控件创建了一个程序集(除其他外)。在此程序集中,有一个 Themes/Generic.xaml 文件用于自定义控件样式。 我想在单独的文件中为不同的控件实现不同的样式,所以我认为使用合并字典是个好主意。
我的 Generic/Themes.xaml 如下所示:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Resources/MyTextBoxStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
文件 MyTextBoxStyle.xaml 如下所示:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:general="clr-namespace:com.testsoft.General">
<Style TargetType="{x:Type general:MyTextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="IsReadOnly" Value="True" />
<Setter Property="Foreground" Value="Black" />
<Style.Triggers>
<Trigger Property="IsReadOnly" Value="True">
<Setter Property="Foreground" Value="Gray" />
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
我添加了一个静态构造函数,以便应用样式:
static MyTextBox()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(typeof(MyTextBox)));
}
在另一个程序集中使用此自定义文本框时,应用程序崩溃并出现以下异常:
IOException: Die Ressource "resources/mytextboxstyle.xaml" kann nicht gefunden werden.
(找不到资源)
但是,如果我不使用 MergedDictionary 方法并将所有样式 XAML 直接添加到 Generic/Themes.xaml 文件中,一切正常。
我尝试将 MyTextBoxStyle.xaml 文件的 Build Action 更改为 Resource、Embedded Resource 但这没有帮助。 如何使用 MergedDictionaries 并且仍然能够在其他程序集中使用样式化控件?
【问题讨论】:
-
为什么首先要在代码中应用样式?那是针对 MVVM...
-
否则样式不会被应用。执行此操作的 MVVM 方式是什么?
-
这取决于您想要做什么...如果您将在代码中创建的文本框添加到您的视图中,那么您已经在打破常规了。通常,您会使用项目控件并将其源绑定到可观察集合并告诉它如何显示给定数据。也许如果你在更大的范围内向我解释你在做什么,我可以提供帮助
-
我创建了一个自定义文本框。 TextBox 在另一个项目中使用(它将与 XAML 一起添加)。 TextBox 提供了一个新属性。我的模型类绑定到这个属性,所以我很确定我在这里没有违反 MVVM 模式。
-
如果你只是在代码中使用它,为什么不这样做:
? MVVM 意味着,除了将执行的代码与显示的视图分开之外,您正在更改代码中视图的设计/行为。除非我在这里遗漏了一些东西,否则这不是模式的确切用途......
标签: c# wpf resourcedictionary mergeddictionaries