事件处理程序 + 格式化多个按钮 - WPF
event handler + formatting multiple buttons - WPF
实际上我有两个问题想解决并在我的 wpf 应用程序中整合。
我有多个具有特定布局的按钮。
<Window.Resources>
<Style x:Key="greenButton" TargetType="Button">
<Setter Property="Background" Value="LightGreen" />
<Setter Property="FontSize" Value="20"/>
<Setter Property="BorderThickness" Value="1"/>
</Style>
...
</Window.Resources>
好的,好的,这是我的按钮:
<Button x:Name="btn100" Grid.Column="0" Grid.Row="2" Style="{StaticResource greenButton}">100</Button>
<Button x:Name="btn101" Grid.Column="0" Grid.Row="3" Style="{StaticResource greenButton}">101</Button>
<Button x:Name="btn102" Grid.Column="0" Grid.Row="4" Style="{StaticResource greenButton}">102</Button>
然后,在 Button-Click 我想触发一个需要按钮标题的方法后
private void btn100_Click(object sender, RoutedEventArgs e)
{
name = (sender as Button).Content.ToString();
doMethod(name);
}
好的。但是我有很多按钮,所以我想将它们与同一个点击事件处理程序放在一起。我试过这个:
<StackPanel Button.Click="button_Click" Grid.RowSpan="20">
<Button Grid.Column="0" Grid.Row="0" FontWeight="Bold" BorderBrush="Black" Style="{StaticResource greenButton}">LT 1</Button>
<Button x:Name="btn100" Grid.Column="0" Grid.Row="2" Style="{StaticResource greenButton}">100</Button>
<Button x:Name="btn101" Grid.Column="0" Grid.Row="3" Style="{StaticResource greenButton}">101</Button>
<Button x:Name="btn102" Grid.Column="0" Grid.Row="4" Style="{StaticResource greenButton}">102</Button>
</StackPanel>
我的 C# 代码现在是:
private void button_Click(object sender, RoutedEventArgs e)
{
name= (sender as Button).Content.ToString();
doMethod(name);
}
现在我遇到了两个问题:
- row-alignment 不适用于我的按钮。使用堆栈面板,它们现在比我在网格中定义的行更大/更高
- 我不知道按钮名称。它总是空的
提前感谢您的帮助。
编辑:
In WPF can I attach the same click handler to multiple buttons at once like I can in Javascript/Jquery? 没有重复 我的解决方案基于此 post 但我在更进一步时遇到问题(布局 + 传输变量)
当您将 Button.Click
处理程序分配给 StackPanel 时,处理程序方法的 sender 参数不是 Button,因此 (sender as Button)
returns null。
您可以改写 (e.OriginalSource as Button)
,因为在您的样式中通过 EventSetter
将点击处理程序分配给所有按钮可能更简单:
<Style x:Key="greenButton" TargetType="Button">
...
<EventSetter Event="Click" Handler="button_Click"/>
</Style>
我认为,发件人在本例中是 StackPanel。尝试使用:
string name = (e.OriginalSource as Button)?.Content.ToString();
实际上我有两个问题想解决并在我的 wpf 应用程序中整合。
我有多个具有特定布局的按钮。
<Window.Resources>
<Style x:Key="greenButton" TargetType="Button">
<Setter Property="Background" Value="LightGreen" />
<Setter Property="FontSize" Value="20"/>
<Setter Property="BorderThickness" Value="1"/>
</Style>
...
</Window.Resources>
好的,好的,这是我的按钮:
<Button x:Name="btn100" Grid.Column="0" Grid.Row="2" Style="{StaticResource greenButton}">100</Button>
<Button x:Name="btn101" Grid.Column="0" Grid.Row="3" Style="{StaticResource greenButton}">101</Button>
<Button x:Name="btn102" Grid.Column="0" Grid.Row="4" Style="{StaticResource greenButton}">102</Button>
然后,在 Button-Click 我想触发一个需要按钮标题的方法后
private void btn100_Click(object sender, RoutedEventArgs e)
{
name = (sender as Button).Content.ToString();
doMethod(name);
}
好的。但是我有很多按钮,所以我想将它们与同一个点击事件处理程序放在一起。我试过这个:
<StackPanel Button.Click="button_Click" Grid.RowSpan="20">
<Button Grid.Column="0" Grid.Row="0" FontWeight="Bold" BorderBrush="Black" Style="{StaticResource greenButton}">LT 1</Button>
<Button x:Name="btn100" Grid.Column="0" Grid.Row="2" Style="{StaticResource greenButton}">100</Button>
<Button x:Name="btn101" Grid.Column="0" Grid.Row="3" Style="{StaticResource greenButton}">101</Button>
<Button x:Name="btn102" Grid.Column="0" Grid.Row="4" Style="{StaticResource greenButton}">102</Button>
</StackPanel>
我的 C# 代码现在是:
private void button_Click(object sender, RoutedEventArgs e)
{
name= (sender as Button).Content.ToString();
doMethod(name);
}
现在我遇到了两个问题:
- row-alignment 不适用于我的按钮。使用堆栈面板,它们现在比我在网格中定义的行更大/更高
- 我不知道按钮名称。它总是空的
提前感谢您的帮助。
编辑: In WPF can I attach the same click handler to multiple buttons at once like I can in Javascript/Jquery? 没有重复 我的解决方案基于此 post 但我在更进一步时遇到问题(布局 + 传输变量)
当您将 Button.Click
处理程序分配给 StackPanel 时,处理程序方法的 sender 参数不是 Button,因此 (sender as Button)
returns null。
您可以改写 (e.OriginalSource as Button)
,因为在您的样式中通过 EventSetter
将点击处理程序分配给所有按钮可能更简单:
<Style x:Key="greenButton" TargetType="Button">
...
<EventSetter Event="Click" Handler="button_Click"/>
</Style>
我认为,发件人在本例中是 StackPanel。尝试使用:
string name = (e.OriginalSource as Button)?.Content.ToString();