【问题标题】:How do I properly style a button in WPF?如何在 WPF 中正确设置按钮的样式?
【发布时间】:2011-03-22 04:45:24
【问题描述】:

我知道这是一个基本问题,但我在理解如何正确执行此操作时遇到了一些麻烦。

给定以下 XAML:

<Button>
    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="16" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Image Grid.Column="0" Width="16" Height="16" Source="Resources/accept.png" />
        <TextBlock Grid.Column="1" Margin="2">Continue</TextBlock>
    </Grid>
</Button>

我如何将它转换为一种样式以便它可以轻松重复使用?如果我想在属性中提供图像源和文本怎么办?这可能吗?

在相关说明中,构建存储样式等文件的最佳做法是什么?您是否只是将它们放入一个新的 XAML 文件并将它们粘贴到样式解决方案文件夹中?

我对 WPF 很陌生,所以,我再次为这个基本问题道歉。

伊恩

【问题讨论】:

    标签: wpf visual-studio-2008 .net-3.5


    【解决方案1】:

    编辑 1:

    有几种方法可以设置控件样式。您可以以StaticResource 的形式访问它们,或提供TargetType,以便将所有样式应用于该类型的控件。

    要参数化您的样式,您可以考虑使用 DataBinding。例如,如果您有一个为这些按钮提供内容的模型,您可以尝试以下操作:

    <Grid.Resources>
        <Style TargetType="Button">
            <Setter Property="Content">
                <Setter.Value>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="16" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
    
                        <Image Grid.Column="0" Width="16" Height="16" Source="{Binding Path=Image}" />
                        <TextBlock Grid.Column="1" Margin="2" Text="{Binding Path=Text}" />
                    </Grid>
                </Setter.Value>
            </Setter>
        </Style>
    </Grid.Resources>
    
    <Button x:Name="myButton1"  Width="100" Height="100" />
    

    这将是如何设置内容的示例。

    myButton1.DataContext = new ButtonCaption {Text = "Testing"};
    
    public class ButtonCaption
    {
        public Image Image { get; set; }
        public string Text { get; set; }
    }
    

    【讨论】:

    • 我应该在解决方案中的什么位置放置样式?是在 XAML 中使用它还是在新的 XAML 中?最后但并非最不重要的一点是,如何在 Button 的属性中提供参数。这可能吗?
    • 您还可以通过删除x:Key 属性并留下TargetType 来自动将样式应用于范围内的所有按钮。
    • 谢谢——我想这正是我想要的。我可以使用纯 XAML 方法提供内容(还是需要在 C# 中进行绑定?)
    【解决方案2】:

    你真正想要的是一个控件模板,而不仅仅是一个简单的样式。 Here 是一个相当不错的教程。

    【讨论】:

    • 他只是在改变按钮的内容。 ControlTemplating 也会改变它的外观和行为。
    • 您不必更改外观/行为。控制模板将允许他更改按钮的图像和文本,并成为更好的通用解决方案。我们不是在谈论制作一个全新的控件——这也是一种可能性。
    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 2023-01-12
    • 2012-09-05
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多