我正在尝试使用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
添加到Trigger
或Style
中?
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”不是Opacity
上Setter
属性的有效值。
也将setter
中的目标字段作为网格或按钮,我在此使用过按钮,但均无效。我还尝试过使用可视性属性,但是出现错误“在使用(密封)“ TriggerCollection”后,无法对其进行修改。”过来。我觉得我缺少了一些东西或以错误的方式实现了这一点。
我在这里浏览了大多数解决方案,但它们似乎位于XAML
中。
指导或链接将不胜感激。
答案 0 :(得分:0)
您应该将Opacity
属性设置为double
的值,即将1
更改为1.0
:
style.Setters.Add(new Setter(OpacityProperty, 1.0, "button"));
就编译器而言, 1
是int
。
答案 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");