【问题标题】:WPF Shaped Button - Visaul Studio/BlendWPF 形状按钮 - Visual Studio/Blend
【发布时间】:2017-08-02 12:24:40
【问题描述】:

我最近开始学习 WPF,遇到了一个小问题。我正在尝试创建一个适合我在 Photoshop 中制作的样式的基本按钮形状(透明)。

这是形状(它就像一个两边各有一个三角形的盒子)。 http://prntscr.com/g3esel

如果在 Blend 中更容易做到并将其实现到视觉中,那么我很想知道如何。

按钮样式:

        <Style x:Key="Clicky" TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <StackPanel Orientation="Horizontal">
                        <Grid Height="74" Width="284" Background="{TemplateBinding Background}"/>
                        <TextBlock Text="{TemplateBinding Content}"  TextAlignment="Center" VerticalAlignment="Center"/>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Cursor" Value="Hand" />
                <Setter Property="Button.Opacity" Value="10" />
            </Trigger>
        </Style.Triggers>
    </Style>

谢谢!

【问题讨论】:

  • 我建议在混合中进行。但在我们进一步讨论之前,我们不知道您的真正问题是什么。如果您对任何与代码相关的内容有任何疑问。那么请走开。但不要指望我们会做你的工作。
  • 感谢您的回复。我不知道如何使用 Blend 所以这是另一个问题...
  • Blend 非常易于使用,但您可以在 Visual Studio 中执行相同的操作。这真的是偏好。看起来你很幸运,有人给了你一个如何做你的事的例子。但是,我会首先尝试更多地学习语言并自己尝试这些东西。我们乐于提供帮助,但我们也希望您进行足够的研究。社区会惩罚相当严厉的问题。

标签: c# wpf


【解决方案1】:

您需要为Button 创建一个ControlTemplate。这可以在 Blend 和 Visual Studio 中完成。我在VS2015中做到了。 这是您的代码:

但是,为了将来,在发布问题之前尝试做some work yourself。包含足够的代码以允许其他人重现该问题。如需帮助,请阅读如何创建Minimal, Complete, and Verifiable example

<Grid Background="Red">
    <Button Height="52" Opacity="0.8">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="Background">
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                            <GradientStop Color="#053755" Offset="0" />
                            <GradientStop Color="#053755" Offset="0.5" />
                            <GradientStop Color="#061F31" Offset="0.5" />
                            <GradientStop Color="#061F31" Offset="1.0" />
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Button">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>
                                <Border Margin="-1,0" Grid.Column="1" Background="{TemplateBinding Background}"  BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0,1">
                                    <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" Content="{TemplateBinding Content}"/>
                                </Border>
                                <Path Fill="{TemplateBinding Background}" Data="M13,0 0,25 0,27 13,52 13,52" Stroke="{TemplateBinding BorderBrush}" Width="13" Stretch="Fill" ClipToBounds="True"/>
                                <Path Grid.Column="2" Data="M0,0 13,25 13,27 0,52" Stroke="{TemplateBinding BorderBrush}" Fill="{TemplateBinding Background}" Width="13" Stretch="Fill" ClipToBounds="True"/>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Button.Style>
    </Button>
</Grid>

【讨论】:

  • 感谢您的帮助。在发帖之前我做了一些研究,但没有找到有用的东西。
  • 关于按钮,我为它创建了一个简单的寺庙,当鼠标悬停在它上面时会改变光标并改变不透明度。由于某种原因,不透明度不起作用......(将代码添加到帖子中)
  • 最大不透明度值为 1。此外,如果您需要使用触发器更改任何属性,则需要避免在按钮本地值中设置此属性(此链接解释了原因 - docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/…)。移除本地不透明度值 (Opacity="0.8") 并将 setter 添加到样式中。()
  • 非常感谢!最后一件事真的会帮助我。如果我的页面上有 4 个按钮,并且在后面的代码中我想循环访问它们,可以通过将它们放在某种数组中来完成吗?
  • 你可以给 Grid 一个 id,创建一个查找 id 的函数,然后询问那里的所有按钮对象。但我不知道你想完成什么
猜你喜欢
  • 1970-01-01
  • 2011-05-29
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
相关资源
最近更新 更多