如何使用后台代码向网格添加触发器

时间:2019-06-24 22:25:35

标签: wpf triggers grid

我正在尝试使用IsMouseOverProperty向其中一个单元格中的按钮添加一个触发器到网格,以便如果用户将鼠标悬停在网格的任何部分上,该按钮就会出现,并且网格,消失。我已经能够在XAML上实现这一目标:

        <Grid Name="myGrid" VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="0 0 20 0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="50"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="35"/>
                <RowDefinition Height="35"/>
                <RowDefinition Height="35"/>
            </Grid.RowDefinitions>
            <Grid.Style>
                <Style TargetType="{x:Type Grid}">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="False">
                            <Setter Property="Opacity" Value="0"/>
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Opacity" Value="1"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Grid.Style>
            <Button Content="buttonA" Background="Yellow" Grid.Row="0"/>
            <Button Content="buttonB" Background="Blue" Grid.Row="1"/>
            <Button Content="buttonC" Background="Red" Grid.Row="2"/>
        </Grid>

,但很难翻译成C#。基本上,所有三个按钮都完全隐藏,直到用户将鼠标悬停在网格的任何部分上方。网格的创建以及附带的触发器取决于用户的操作,因此为什么我要尝试在后面的代码中编写它。

我编写的示例代码是:

Grid myGrid = new Grid();
//create rows and columns, add to row and column definitions of myGrid
myGrid.Background = Brushes.Transparent;

Button button = new Button()
{
 Opacity = 0,
 //other button style 
};Grid.SetColumn(button, 0);Grid.SetRow(button, 0);myGrid.Children.Add(button);

Trigger trigger = new Trigger()
{
  SourceName = "myGrid",
  Property = Grid.IsMouseOverProperty,
  Value = true
 };

这一切都很好。我了解在申请Trigger之前必须将Style包裹在myGrid中,但是我是否将Setter添加到TriggerStyle中?

Style style = new Style(typeof(Grid));

trigger.Setters.Add(new Setter(OpacityProperty, 1, "button"));
//or
style.Setters.Add(new Setter(OpacityProperty, 1, "myGrid"));

myGrid.Style = style;
myGrid.Style.Triggers.Add(trigger);

但是我得到错误“ 1”不是OpacitySetter属性的有效值。

也将setter中的目标字段作为网格或按钮,我在此使用过按钮,但均无效。我还尝试过使用可视性属性,但是出现错误“在使用(密封)“ TriggerCollection”后,无法对其进行修改。”过来。我觉得我缺少了一些东西或以错误的方式实现了这一点。

我在这里浏览了大多数解决方案,但它们似乎位于XAML中。

指导或链接将不胜感激。

2 个答案:

答案 0 :(得分:0)

您应该将Opacity属性设置为double的值,即将1更改为1.0

style.Setters.Add(new Setter(OpacityProperty, 1.0, "button"));
就编译器而言,

1int

答案 1 :(得分:-1)

希望这对其他人有帮助:

由于样式是固定的,与用户的先前操作无关,因此我可以像在XAML中那样将其创建为资源:

 <Window.Resources>
        <Style x:Key="myStyle" TargetType="{x:Type Grid}">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="False">
                    <Setter Property="Opacity" Value="0"/>
                </Trigger>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Opacity" Value="1"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

,然后从后面的代码中引用:

Grid myGrid = new Grid();
//create rows and columns, add to row and column definitions of myGrid
myGrid.Background = Brushes.Transparent;

Button button = new Button()
{
 //button style 
};Grid.SetColumn(button, 0);Grid.SetRow(button, 0);myGrid.Children.Add(button);

myGrid.Style = (Style)FindResource("myStyle");