2

当我创建 WPF 应用程序时,我的 XAML 很快就开始膨胀。

然后我以 HTML/CSS 的方式处理 XAML/样式问题,寻找重复的代码并将其打包到我放入 Window.Resources 部分的样式中。

这是其他人正在这样做的方式,还是现在在 XAML 中有更好的方式?似乎下面的两个块仅在两个小词上有所不同,似乎我可以将它放在某种功能性用户控件中(这是左侧菜单),这样当我的菜单中有 25 个元素时,我可以只有 25 行与名称相同,可能还有 Click 目标。

或者,当我将其移至 MVVM 时,此问题将通过 DataBinding 自行解决(它目前只是一个硬编码原型),因此我可以将菜单项的名称保存在我的 ViewModel 的集合中,然后创建在 ItemsControl 中动态菜单?

或者,臃肿的 XAML 文件只是WPF 应用程序的现实吗?

创建 WPF 应用程序时,您有哪些 XAML 样式策略?

Window.Resources(文件顶部):

<Window.Resources>
    <Style x:Key="Link" TargetType="Button">
        <Setter Property="Cursor" Value="Hand"/>
        <Setter Property="Foreground" Value="#555"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <TextBlock TextDecorations="Underline" 
                Text="{TemplateBinding Content}"
                Background="{TemplateBinding Background}"/>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter Property="Foreground" Value="Red"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

当前 XAML:

<Expander HorizontalAlignment="Left" Header="File" VerticalAlignment="Top" ExpandDirection="Down" Width="200" Padding="2">
    <Expander.Background>
        <LinearGradientBrush>
            <GradientStop Color="#bbb" Offset="0"/>
            <GradientStop Color="#ccc" Offset="1"/>
        </LinearGradientBrush>
    </Expander.Background>
    <Border CornerRadius="5">
        <Border.Background>
            <LinearGradientBrush>
                <GradientStop Color="#ccc" Offset="0"/>
                <GradientStop Color="#bbb" Offset="1"/>
            </LinearGradientBrush>
        </Border.Background>
        <StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Top">
            <Button Click="buttonClose_Click" 
                Style="{StaticResource Link}" 
                Margin="10 3 3 3"
                Content="Close">
            </Button>
        </StackPanel>
    </Border>
</Expander>

<Expander HorizontalAlignment="Left" Header="Customers" VerticalAlignment="Top" ExpandDirection="Down" Width="200" Padding="2">
    <Expander.Background>
        <LinearGradientBrush>
            <GradientStop Color="#bbb" Offset="0"/>
            <GradientStop Color="#ccc" Offset="1"/>
        </LinearGradientBrush>
    </Expander.Background>
    <Border CornerRadius="5">
        <Border.Background>
            <LinearGradientBrush>
                <GradientStop Color="#ccc" Offset="0"/>
                <GradientStop Color="#bbb" Offset="1"/>
            </LinearGradientBrush>
        </Border.Background>
        <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
            <Button Click="btnAppPage_Click" 
                Tag="CustomerAdd"
                Style="{StaticResource Link}" 
                Margin="10 3 3 3"
                Content="Create Customer"/>
        </StackPanel>
    </Border>
</Expander>
4

2 回答 2

1

简单:识别重复并将其移动到控件中。控件可以具有在运行时组成所需变化所需的任何属性。并且可以通过作为控件来重新模板化。

于 2009-04-08T08:42:36.440 回答
0

此外,您可以识别重复并将它们移动到资源中。一个资源可以轻松引用另一个资源。

于 2009-04-08T17:20:34.493 回答