c# - 代码后面的属性更改后控制模板触发器无法正确触发 [WPF]

标签 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>

这在鼠标悬停时完美运行。然而,在我的应用程序中,我有文本框和列表框的组合,这使我成为搜索框。每当我搜索特定元素时,我希望在上面的样式中制作与鼠标悬停相同的“闪耀按钮”效果

我尝试这样做:

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;
                }
            }
        }

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

但是我遇到了两个问题。在代码后面执行此操作时,我可以更改所有内容,但我的边框画笔将保留,因为它是在 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

然而,这不起作用“elementButton.BorderBrush = Brushes.Gold”,它与 xaml 中一样保持透明。突然我的鼠标悬停光芒不再一样了,它是 <Setter Property="Foreground" Value="Gold" /> <Setter Property="FontWeight" Value="ExtraBold"/>

函数调用后似乎没有触发

总结一下。我希望所有文本框搜索都具有相同的按钮外观和闪耀效果

最佳答案

您的触发器更改名为“Border”的元素上的BorderBrush。但是,在后面的代码中,您在按钮上设置了 BorderBrush ,这不会执行任何操作,因为您没有在模板中的任何位置使用属性 BorderBrush 。您需要做的是将 Button 的 BorderBrush 属性 TemplateBinding 绑定(bind)到模板,如下所示:

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

为了在代码隐藏中设置属性时,当鼠标悬停在按钮上时触发 FontWeightForeground,一种可能的解决方案如下。

ContentPresenter 中设置 TextBlock 属性,然后使用 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"/>

关于c# - 代码后面的属性更改后控制模板触发器无法正确触发 [WPF],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37361932/

相关文章:

c# - 使用 java 未达到预期结果,但使用 c# 可以达到预期结果

wpf - DataGrid 计算两个数据绑定(bind)单元格中值之间的差异

wpf - 如何删除 MenuItem 的图标列和文本之间的垂直线

标题列上的 WPF ListView 填充

c# - 如何将 XAML View 文件与其代码隐藏文件重新连接?

c# - 如何在 WPF DataGrid 列中制作互斥复选框

c# - 串行端口数据形式的停止按钮功能使其无响应

c# - XAML设计器因自注册ViewModel而崩溃

c# - Profiler 报警统计

wpf - 使 WPF TextBox 仅与它所拥有的房间一样宽,但随着空间的扩大而扩大?