Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 样式和模板的重用_C#_.net_Wpf_Wpf Style - Fatal编程技术网

C# 样式和模板的重用

C# 样式和模板的重用,c#,.net,wpf,wpf-style,C#,.net,Wpf,Wpf Style,我一直在为几个Wpf项目工作。在每个项目中,我们都需要设置默认Wpf控件(例如按钮)的样式。每次我们开始一个新项目时,我们都从头开始构建模板和样式,或者只是将它们从一个程序集复制到另一个程序集 因为我讨厌一次又一次地复制和重新创建相同的代码,所以我想收集这些样式并将它们移动到一个地方,这样我就可以在多个项目中使用它们,而不用花很多力气 修改示例(再次使用按钮控件): 我们需要改变不同按钮状态的刷子,以适应应用的要求 | Hover-Brush | Click-Effect

我一直在为几个Wpf项目工作。在每个项目中,我们都需要设置默认Wpf控件(例如按钮)的样式。每次我们开始一个新项目时,我们都从头开始构建模板和样式,或者只是将它们从一个程序集复制到另一个程序集

因为我讨厌一次又一次地复制和重新创建相同的代码,所以我想收集这些样式并将它们移动到一个地方,这样我就可以在多个项目中使用它们,而不用花很多力气

修改示例(再次使用按钮控件): 我们需要改变不同按钮状态的刷子,以适应应用的要求

            | Hover-Brush | Click-Effect   | 
|-----------|-------------|----------------|
| Project A | Orange      | Light Orange   |
| Project B | Blue        | Light Blue     |
| ...       | ...         | ...            |
为了实现我的目标,我需要抽象出以下示例样式:

<Style TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="Border" Background="Orange">
                    <!-- Further elements required to build our button -->
                </Border>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="Border" Property="Background" Value="LightOrange" />
                    </Trigger>
                    <!-- Further triggers for other effects -->
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>   
</Style>
这种样式会将不同应用程序中的新主题所需的标记减少为以下内容:

<Style TargetType="{x:Type Button}"
       x:Key="DefaultButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="Border" Background="{TemplateBinding Background}">
                    <!-- Further elements required to build our button -->
                </Border>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="Border" 
                                Property="Background" 
                                Value="{Binding Path=styles:Brushes.HoverBrush, 
                                                RelativeSource={RelativeSource TemplatedParent}, 
                                                FallbackValue={StaticResource SomeBrush}}" />
                    </Trigger>
                    <!-- Further triggers for other effects -->
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>   
</Style>
<Style TargetType="{x:Type Button}"
       BasedOn="{StaticResource DefaultButton}">
    <Setter Property="styles:Brushes.HoverBrush"
            Value="LightOrange" />
</Style>


所以我的问题是:有不同的方法吗?你认为我的方法有消极的一面吗?最重要的是:你知道更有效的方法来实现我的目标吗?

因为每个新的应用程序都会被主题化,所以我只需要在Generic.xaml中定义一些笔刷,并执行{DynamicResource HoverBrush}


按钮样式的xaml可以保持不变,在每个新应用程序中,您只需要使用相同的通用名称定义新画笔。xaml

这需要我定义每个应用程序中的每种颜色,即使我们只需要细微的更改,不是吗?是的,这是一个很好的观点,如果需要稍作更改,您只需修改按钮样式的单个属性即可。我不知道,要么你到处找/包括一个包含附加属性定义的类库,要么你把画笔复制到Generic.xaml中。我想这两者都有好处/坏处。您可以考虑在可重用资源字典中定义这些画笔(在每个新AP中合并到您的Gyn.xAML)中,然后只定义一个具有相同名称的本地刷子来“覆盖”单个颜色(由于动态资源的性质),谢谢您的说明。我一定会看看这个尝试。不必担心,希望这些方法中的一种效果不错。如果你找到一种更干净的方法,请告诉我。