如何更改动态生成的按钮上的默认鼠标悬停行为

时间:2015-02-02 23:17:42

标签: c# wpf code-behind dynamically-generated mousehover

我是WPF的一个相对较新的用户,并且遇到了关于动态按钮生成和按钮的问题。默认悬停属性。

我目前正在开发一个应用程序,其中在后面的代码中在Canvas上生成大量按钮。每个按钮的内容是由包含Uri字符串的对象数组引用的唯一图像。通过读入包含这些Uri字符串的文件来填充此数组,因此此画布上按钮的数量和位置因读取的文件而异。

在大多数情况下,应用程序运行时Canvas的外观是预期的,但悬停在任何按钮上会在鼠标重叠的持续时间内用默认的蓝色背景替换图像。

以下是我用来生成按钮的代码示例:

exampleButton = new Button { Content = "Name", Width = 50, Height = 65, Background = new ImageBrush(new BitmapImage(new Uri(@object.UriString, UriKind.Relative))) };
exampleButton.Style = exampleStyle;
exampleCanvas.Children.Add(exampleButton);

请理解我省略了与我的问题无关的代码段。

以下是使用的样式的示例,也在后面的代码中:

exampleStyle = new Style(typeof(Button));
exampleStyle.Setters.Add(new Setter(Button.ForegroundProperty, Brushes.Transparent));
exampleStyle.Setters.Add(new Setter(Button.BorderBrushProperty, Brushes.Transparent));

这些共同实现了我试图创造的效果,禁止悬停行为。

到目前为止,我已经尝试将ControlTemplate覆盖添加到样式声明中,但不确定如何将XAML转换为后面的C#代码。我也尝试过创建和绑定在XAML中创建的按钮模板,但我还没有成功找到适合我情况的解释或教程。

通过后面的代码实现这一目标的任何帮助将不胜感激。当然,如果我真的非常规地做这件事,并且有一种更标准的做事方式,那我就是耳朵。

修改 这是我用来声明我动态生成的按钮正在使用的样式的XAML。

<Style x:Key="MySuperButtonStyle" TargetType="{x:Type Button}">
        <Setter Property="OverridesDefaultStyle" Value="True" />
        <Setter Property="Width" Value="50" />
        <Setter Property="Height" Value="65" />
        <Setter Property="Foreground" Value="Transparent" />
        <Setter Property="BorderBrush" Value="Black" />
        <Setter Property="BorderThickness" Value="1" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="BorderBrush" Value="Black"/>
            </Trigger>
        </Style.Triggers>
    </Style>

使用此调用在后面的代码中指定样式:

exampleButton.Style = (Style)FindResource("MySuperButtonStyle");

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为默认的Button控件样式有一个触发器,当鼠标悬停在按钮上时,它会更改按钮的Background属性。您需要为按钮使用自定义样式:

<Style x:Key="MySuperButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="Width" Value="50" />
    <Setter Property="Height" Value="65" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{TemplateBinding Background}">
                    <ContentPresenter HorizontalAlignment="Center"
                        VerticalAlignment="Center" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

此处使用样式设置宽度和高度,因此您不再需要在代码中设置这些属性。控件模板已更改,因此它仅包含一个Border元素,其中包含内容。根本没有触发器,因此单击或悬停时按钮不会改变其外观。

在您的代码中,您需要做的就是获取对此样式的引用,然后在创建按钮时将其分配给Style属性。

说完这一切之后,在WPF中你很少需要在代码中创建控件。相反,你应该真正使用MVVM(Model-View-ViewModel)模式和数据绑定。您可能不应该在代码中创建样式和设置器。