在我的WPF应用程序中,我有很多DockPanel,它们包含一个复选框和一个标签。我想让应用程序处理DockPanel的mousedown事件,就好像单击了复选框一样,即用户不必专门单击该复选框;他还可以单击标签以选中/取消选中该复选框。 我添加了一个Eventhandler“DockPanel_MouseDown”,它只是翻转复选框的IsChecked属性,这是有效的。 我的问题是我有很多DockPanels,我不想给每个复选框和每个dockpanel一个名字,并编写数百个基本上做同样事情的事件处理程序。 有没有办法将这种行为放在样式或模板中? ç
答案 0 :(得分:2)
为什么使用单独的标签来检查和取消选中复选框?
<StackPanel>
<CheckBox IsChecked="{Binding IsChecked, ElementName=checkbox}" Content="Hello">
<CheckBox.Template>
<ControlTemplate TargetType="CheckBox">
<ContentPresenter/>
</ControlTemplate>
</CheckBox.Template>
</CheckBox>
<CheckBox x:Name="checkbox" Content="Normal checkbox"/>
</StackPanel>
答案 1 :(得分:0)
您不必为每个停靠窗口命名它们或事件处理程序。
您可以为所有这些dockpanel使用相同的事件处理程序,并且在您的事件处理程序中,您可以使用发件人而不是名称。
<StackPanel Orientation="Vertical">
<DockPanel Tag="false" MouseUp="DockPanel_OnMouseUp">
<CheckBox DockPanel.Dock="Left" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DockPanel}}, Path=Tag, Mode=TwoWay}"/>
<Label DockPanel.Dock="Right" Content="CheckBox1" />
</DockPanel>
<DockPanel Tag="false" MouseUp="DockPanel_OnMouseUp">
<CheckBox DockPanel.Dock="Left" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DockPanel}}, Path=Tag, Mode=TwoWay}"/>
<Label DockPanel.Dock="Right" Content="CheckBox1"/>
</DockPanel>
<DockPanel Tag="false" MouseUp="DockPanel_OnMouseUp">
<CheckBox DockPanel.Dock="Left" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DockPanel}}, Path=Tag, Mode=TwoWay}"/>
<Label DockPanel.Dock="Right" Content="CheckBox1"/>
</DockPanel>
<DockPanel Tag="false" MouseUp="DockPanel_OnMouseUp">
<CheckBox DockPanel.Dock="Left" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DockPanel}}, Path=Tag, Mode=TwoWay}"/>
<Label DockPanel.Dock="Right" Content="CheckBox1"/>
</DockPanel>
</StackPanel>
代码:
private void DockPanel_OnMouseUp(object sender, MouseButtonEventArgs e)
{
var dockPanel = (DockPanel) sender;
dockPanel.Tag = !dockPanel.Tag.ToString().ToLower().Equals("true");
}