闪烁按钮(非常基本)

时间:2017-02-23 15:48:16

标签: c# wpf xaml

所以我创建了一个非常(并且我不能强调)简单程序,因为我刚刚开始学习WPF。

事实上,它很简单,我可以在这里写下来:

<Window x:Class="TestWPF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="650" Width="825">
<Grid>
    <StackPanel Width="125" Background="AliceBlue" Margin="0,10,200,10">
        <Button Margin="5,5,5,5" Height="50" Width="100" Content="Tester" Background="Coral">

        </Button>    
    </StackPanel>

</Grid>

但这个程序有问题。按钮闪烁。

当我加载程序时,按钮是珊瑚色(如预期的那样)。如果我将鼠标移到它上面,它会变回原来的颜色(我猜颜色来自控制它的颜色?正如你所看到的,我只为按钮指定了一种颜色。)

当我点击按钮(左键)时出现问题。当我这样做时,按钮在一秒钟左右的时间内从一种颜色(珊瑚色)转换到另一种颜色(爱丽丝蓝色)。它一遍又一遍地来回走动。如果我在这种状态下将鼠标悬停在它上面,它会像正常情况一样返回鼠标颜色,但是当我将鼠标从它上移开时,它会再次开始闪烁。

要明确:这不是关于鼠标悬停时颜色的变化。我很好。单击按钮后,所述按钮一次又一次地在两种颜色之间转换。颜色是珊瑚色,鼠标是颜色,当然我没有说明。

我在这里不知所措。我没有告诉它这样做(有吗?)我没有点击属性中的任何内容或写下任何代码。 XAML就是我所做的一切。

为什么按钮会闪烁?

编辑这里有一些显示整个内容的images。所有代码(没有任何代码)。 XAML,app.xaml.cs,一切。

编辑2 另一张包含所有button properties的图片。据我所知,我没有改变任何东西。

2 个答案:

答案 0 :(得分:2)

这是因为Windows中的默认样式。

正常按钮(在Windows 7上)从双色调灰色过渡到双色调蓝色,由默认控制模板触发。

您可以编辑控件模板并在按钮上设置样式..

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" x:Class="WpfApplication1.MainWindow"
    Title="MainWindow" Height="650" Width="825">
    <Window.Resources>
        <Style x:Key="ButtonFocusVisual">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
            <GradientStop Color="#F3F3F3" Offset="0"/>
            <GradientStop Color="#EBEBEB" Offset="0.5"/>
            <GradientStop Color="#DDDDDD" Offset="0.5"/>
            <GradientStop Color="#CDCDCD" Offset="1"/>
        </LinearGradientBrush>
        <SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/>
        <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
            <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
            <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
            <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="Padding" Value="1"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" RenderDefaulted="{TemplateBinding IsDefaulted}" SnapsToDevicePixels="true">
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Themes:ButtonChrome>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsKeyboardFocused" Value="true">
                                <Setter Property="RenderDefaulted" TargetName="Chrome" Value="true"/>
                            </Trigger>
                            <Trigger Property="ToggleButton.IsChecked" Value="true">
                                <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="#ADADAD"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <StackPanel Width="125" Background="AliceBlue" Margin="0,10,200,10">
            <Button Margin="5,5,5,5" Height="50" Width="100" Content="Tester" Background="Coral" Style="{DynamicResource ButtonStyle1}"/>
        </StackPanel>

    </Grid>
</Window>

您现在可以看到其他颜色的来源

RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" RenderDefaulted="{TemplateBinding IsDefaulted}"删除属性<Themes:ButtonChrome<ControlTemplate.Triggers>禁用此行为

答案 1 :(得分:2)

您遇到的“闪烁”可能来自Button的默认模板。您可以覆盖它以使Button看起来像一个没有任何效果的纯矩形:

<Button Margin="5,5,5,5" Height="50" Width="100" Content="Tester" Background="Coral">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" 
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Padding="{TemplateBinding Margin}">
                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
            </Border>
        </ControlTemplate>
    </Button.Template>
</Button>