UserControls的资源模板

时间:2015-07-29 14:26:24

标签: c# wpf xaml user-controls

我正在开发一个多个UserControls的程序,该程序应遵循相同的可视化指南,因为它们将作为应用程序的TabPages运行,以向用户显示一些数据。

基本上,所有UserControls都有两列。在第1列中,我有一个标签,描述哪个值属于实际控件,第二列是控件(TextBoxDatePickerCheckbox等),供用户设置:

Layout

当我设计第一个UserControls时,我最终得到了一堆Styles我在UserControl s这样设置的资源,所以所有标签都有相同的宽度,右对齐文本,反之亦然:

<UserControl.Resources>
    <Style TargetType="{x:Type Label}">
        <Setter Property="Width" Value="250"/>
        <Setter Property="DockPanel.Dock" Value="Left"/>
        <Setter Property="VerticalAlignment" Value="Top"/>
        <Setter Property="HorizontalContentAlignment" Value="Right"/>
    </Style>
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="DockPanel.Dock" Value="Top"/>
        <Setter Property="TextWrapping" Value="Wrap"/>
        <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="Margin" Value="2"/>
    </Style>
    <Style TargetType="{x:Type ComboBox}">
        <Setter Property="DisplayMemberPath" Value="Value"/>
        <Setter Property="SelectedValuePath" Value="Key"/>
        <Setter Property="Margin" Value="2"/>
    </Style>
    <Style TargetType="{x:Type DockPanel}">
        <Setter Property="DockPanel.Dock" Value="Top"/>
    </Style>
</UserControl.Resources>

现在,因为我要创建所有其他60 + UserControls我想避免将这些完全相同的代码一遍又一遍地添加到每个UserControl,只是为了实现视觉风格的一致性,如标签的固定宽度等等,因为维护起来非常糟糕(想象一下,客户要求所有标签的宽度都要小50倍......)。

是否想知道是否有任何方法可以在应用程序的某个位置设置此格式化内容,然后只需&#34; import&#34;我的UserControls的设置如下:

主文件

<Master.Template1>
    <Style TargetType="{x:Type Label}">
        ...
    </Style>
    <Style TargetType="{x:Type TextBox}">
        ...
    </Style>
    <Style TargetType="{x:Type ComboBox}">
        ...
    </Style>
    <Style TargetType="{x:Type DockPanel}">
        ...
    </Style>
</Master.Template1>

其他UC

<UserControl.Resources>
    <using Style:Master.Template1/> 
</UserControl.Resources>

我已经阅读了有关此Application.ResourceDictionary的一些内容,但我不确定我是否正确地走上了正确的轨道,因为我不想乱用代码隐藏文件。

或者我应该从UserControl创建我自己的控件派生,而ref已经拥有在其资源中设置的所有值?

2 个答案:

答案 0 :(得分:1)

将新的ResourceDictionary文件添加到项目中。将您的样式放在ResourceDictionary

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style TargetType="{x:Type Label}">
        <Setter Property="Width" Value="250"/>
        <Setter Property="DockPanel.Dock" Value="Left"/>
        <Setter Property="VerticalAlignment" Value="Top"/>
        <Setter Property="HorizontalContentAlignment" Value="Right"/>
    </Style>
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="DockPanel.Dock" Value="Top"/>
        <Setter Property="TextWrapping" Value="Wrap"/>
        <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="Margin" Value="2"/>
    </Style>
    <Style TargetType="{x:Type ComboBox}">
        <Setter Property="DisplayMemberPath" Value="Value"/>
        <Setter Property="SelectedValuePath" Value="Key"/>
        <Setter Property="Margin" Value="2"/>
    </Style>
    <Style TargetType="{x:Type DockPanel}">
        <Setter Property="DockPanel.Dock" Value="Top"/>
    </Style>

</ResourceDictionary>

然后将资源字典添加到UserControl.Resources

<UserControl.Resources>
    <ResourceDictionary Source="MyResources.xaml"/> 
</UserControl.Resources>

答案 1 :(得分:1)

编辑:

Glen Thomas 和我设法同时回答了这个问题。我仍然保留自己的答案,因为the article on MSDN包含一些有用的进一步信息,即将到来的用户可能会发现知道如何首先添加ResourceDictionary很有用。< / p>

当然这是可能的,并且像我希望的那样简单:ResourceDictionarys是要走的路!

article in the MSDN让我朝着正确的方向发展。

我刚刚在我的程序中添加了一个新的ResourceDictionary

enter image description here

并将参考代码放入其中:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Label}">
        <Setter Property="Width" Value="250"/>
        <Setter Property="DockPanel.Dock" Value="Left"/>
        <Setter Property="VerticalAlignment" Value="Top"/>
        <Setter Property="HorizontalContentAlignment" Value="Right"/>
    </Style>
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="DockPanel.Dock" Value="Top"/>
        <Setter Property="TextWrapping" Value="Wrap"/>
        <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="Margin" Value="2"/>
    </Style>
    <Style TargetType="{x:Type ComboBox}">
        <Setter Property="DisplayMemberPath" Value="Value"/>
        <Setter Property="SelectedValuePath" Value="Key"/>
        <Setter Property="Margin" Value="2"/>
    </Style>
    <Style TargetType="{x:Type DockPanel}">
        <Setter Property="DockPanel.Dock" Value="Top"/>
    </Style>
</ResourceDictionary>

之后,通过将UserControl替换为UserControl.Resources,我能够将词典“导入”<UserControl.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="ResourceDictionary1.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </UserControl.Resources>

{{1}}

并且vo:格式化控件,能够选择是否应用资源“模板”,以及修改共享值的中心位置。

完美!