在[WPF]后面的代码中更改属性后控件模板触发器未正确触发

时间:2016-05-21 10:51:11

标签: c# wpf xaml

我正在制作一个wpf应用程序的元素周期表,并使我的按钮像这样:

<!-- RoundedButton.xaml -->

<Style x:Key="ButtonFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Border>
                    <Rectangle SnapsToDevicePixels="true" Margin="4" Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="RoundedButton" TargetType="{x:Type Button}" x:Name="butt">
    <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="BorderThickness" Value="3"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Padding" Value="0,0,1,1"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">


                <Border CornerRadius="12,12,12,12" BorderThickness="3,3,3,3" RenderTransformOrigin="0.5,0.5" x:Name="border" BorderBrush="Transparent">
                    <Border.RenderTransform>
                        <TransformGroup>
                            <ScaleTransform ScaleX="1" ScaleY="1"/>
                            <SkewTransform AngleX="0" AngleY="0"/>
                            <RotateTransform Angle="0"/>
                            <TranslateTransform X="0" Y="0"/>
                        </TransformGroup>
                    </Border.RenderTransform>

                    <Border Background="{TemplateBinding Background}" CornerRadius="12,12,12,12"  x:Name="bordertrue">
                        <Grid>

                            <Border Opacity="0" x:Name="Shine" Width="Auto" Height="Auto" CornerRadius="12,12,10,10" Margin="0,0,0,0">
                                <Border.Background>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="Indigo" Offset="0"/>
                                        <GradientStop Color="Crimson" Offset="0.5"/>
                                        <GradientStop Color="Crimson" Offset="0.5"/>
                                        <GradientStop Color="Indigo" Offset="1"/>
                                    </LinearGradientBrush>
                                </Border.Background>
                            </Border>
                            <ContentPresenter VerticalAlignment="Center"  Grid.RowSpan="2" HorizontalAlignment="Center" x:Name="contentPresenter"/>
                        </Grid>
                    </Border>
                </Border>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Opacity" TargetName="border" Value="1"/>
                        <Setter Property="Opacity" TargetName="contentPresenter" Value="0.5"/>
                    </Trigger>

                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="RenderTransform" TargetName="border">
                            <Setter.Value>
                                <TransformGroup>
                                    <ScaleTransform ScaleX="0.9" ScaleY="0.9"/>
                                    <SkewTransform AngleX="0" AngleY="0"/>
                                    <RotateTransform Angle="0"/>
                                    <TranslateTransform X="0" Y="0"/>
                                </TransformGroup>
                            </Setter.Value>
                        </Setter>
                    </Trigger>

                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Opacity" TargetName="Shine" Value="1"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="Gold"/>
                        <Setter Property="Foreground"  Value="Gold" />
                        <Setter Property="FontWeight"  Value="ExtraBold"/>

                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这对鼠标悬停起到了很好的作用。但是在我的应用程序中,我有一个文本框和列表框的组合,这使我成为一个搜索框。每当我搜索一个特定的元素时,我希望制作相同的&#34; Shine按钮&#34;效果与鼠标悬停在上面的样式

我试图这样做:

private void highlight(string elementName, bool MultiOrSingle)
    {
        LinearGradientBrush gradient1 = new LinearGradientBrush();
        gradient1.StartPoint = new Point(0.5, 0);
        gradient1.EndPoint = new Point(0.5, 1);

        gradient1.GradientStops.Add(new GradientStop(Colors.Indigo, 0));
        gradient1.GradientStops.Add(new GradientStop(Colors.Crimson, 0.5));
        gradient1.GradientStops.Add(new GradientStop(Colors.Crimson, 0.5));
        gradient1.GradientStops.Add(new GradientStop(Colors.Indigo, 1));
        if (MultiOrSingle == true)
        {
            foreach (Button elementButton in VisualChildren.FindVisualChildren<Button>(this))
            {
                if (listBox.Items.Contains(elementButton.Name) == true)
                {
                    elementButton.Background = gradient1;
                    elementButton.FontWeight = FontWeights.Bold;
                    elementButton.Foreground = Brushes.Gold;
                    elementButton.BorderBrush = Brushes.Gold;
                }
                else
                {
                    elementButton.Background = previousBackgroundColors[elementButton.Name];
                    elementButton.Foreground = previousForegroundColors[elementButton.Name];
                }
            }
            foreach (Button elementButton in VisualChildren.FindVisualChildren<Button>(this))
            {
                if (elementButton.Name != "play_quiz" &&
                    elementButton.Name != "show_scoreboard" &&
                    elementButton.Name != "update" &&
                    elementButton.Name != "DragDropGames" &&
                    listBox.Items.Contains(elementButton.Name) == false)
                {
                    elementButton.Background = Brushes.Gainsboro;
                    elementButton.BorderBrush = Brushes.DarkBlue;
                    elementButton.FontWeight = FontWeights.Normal;
                    elementButton.Foreground = Brushes.Black;
                }
            }
        }
        else
        {
            foreach (Button elementButton in VisualChildren.FindVisualChildren<Button>(this))
            {
                if (elementName == elementButton.Name)
                {

                    elementButton.Background = gradient1;
                    elementButton.BorderBrush = Brushes.Gold;
                    elementButton.FontWeight = FontWeights.Bold;
                    elementButton.Foreground = Brushes.Gold;
                }
                else
                {
                    elementButton.Background = previousBackgroundColors[elementButton.Name];
                    elementButton.Foreground = previousForegroundColors[elementButton.Name];
                }
            }

            foreach (Button elementButton in VisualChildren.FindVisualChildren<Button>(this))
            {
                if (elementButton.Name != "play_quiz" &&
                    elementButton.Name != "show_scoreboard" &&
                    elementButton.Name != "update" &&
                    elementButton.Name != "DragDropGames" &&
                    elementName != elementButton.Name)
                {
                    elementButton.Background = Brushes.Gainsboro;
                    elementButton.BorderBrush = Brushes.DarkBlue;
                    elementButton.FontWeight = FontWeights.Normal;
                    elementButton.Foreground = Brushes.Black;
                }
            }
        }

只需设置背景画笔等等....

但是我遇到了2个问题。在后面的代码中执行此操作时,我可以更改所有内容,但我的边框画笔将保留,因为它是以xaml样式确定的,我无法在代码中更改它,不知道为什么?当我将鼠标悬停在按钮上时调用此功能后,它们将闪耀......但是,属性前景不会变为黄金?它会保持黑色

演示:

So this is my mouseover "Shine". When I go with mouse over the button it will change it's look like this

So this is my problem I have searched for H..it came back with few results and called function from above as "multi" and selected all results

然而,这并没有奏效&#34; elementButton.BorderBrush = Brushes.Gold&#34;它像xaml一样保持透明。突然间,我的Mouseover闪耀不再是 <Setter Property="Foreground" Value="Gold" /> <Setter Property="FontWeight" Value="ExtraBold"/>

了 在函数调用

之后似乎没有触发

总结一下。我希望对我的所有文本框搜索都有相同的按钮和光泽效果

1 个答案:

答案 0 :(得分:1)

您的Trigger更改了名为“BorderBrush”的元素上的Border。但是,在您的代码中,您在按钮上设置BorderBrush,这样做无效,因为您不在模板中的任何位置使用属性BorderBrush。您需要做的是TemplateBinding Button的BorderBrush属性到模板,如下所示:

<Border CornerRadius="12,12,12,12" 
        BorderThickness="3,3,3,3" 
        RenderTransformOrigin="0.5,0.5" 
        x:Name="border" 
        BorderBrush="{TemplateBinding BorderBrush}">

为了在代码后面设置属性时鼠标悬停在按钮上时触发FontWeightForeground,可能的解决方法如下:

TextBlock中设置ContentPresenter属性,然后使用TemplateBinding设置值。

<ContentPresenter TextBlock.Foreground="{TemplateBinding Foreground}" 
                  TextBlock.FontWeight="{TemplateBinding FontWeight}"
                  VerticalAlignment="Center"  
                  Grid.RowSpan="2" 
                  HorizontalAlignment="Center" 
                  x:Name="contentPresenter"/>

<Setter Property="TextBlock.Foreground" TargetName="contentPresenter" Value="White" />
<Setter Property="TextBlock.FontWeight" TargetName="contentPresenter" Value="ExtraBold"/>