隧道 Dockpanel 鼠标按下事件到 WPF 中的复选框
Tunnel Dockpanel Mousedown Event To Checkbox in WPF
在我的 WPF 应用程序中,我有很多由复选框和标签组成的 DockPanel。我想让应用程序处理 DockPanel 的 mousedown 事件,就像单击复选框一样,即用户不必专门单击复选框;他还可以单击标签以 check/uncheck 复选框。
我添加了一个 Eventhandler "DockPanel_MouseDown",它只是翻转了复选框的 IsChecked 属性,这很有效。
我的问题是我有很多这样的 DockPanel,我不想给每个复选框和每个 dockpanel 一个名字并编写数百个基本上做同样事情的事件处理程序。
有没有办法将该行为放入样式或模板中?
C
为什么要使用单独的标签来选中和取消选中复选框?
Use this Alternative solution
<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>
您实际上不必为每个停靠面板命名它们或事件处理程序。
您可以对所有这些停靠面板使用相同的事件处理程序,并且在您的事件处理程序中,您可以使用发件人而不是姓名。
<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");
}
在我的 WPF 应用程序中,我有很多由复选框和标签组成的 DockPanel。我想让应用程序处理 DockPanel 的 mousedown 事件,就像单击复选框一样,即用户不必专门单击复选框;他还可以单击标签以 check/uncheck 复选框。 我添加了一个 Eventhandler "DockPanel_MouseDown",它只是翻转了复选框的 IsChecked 属性,这很有效。 我的问题是我有很多这样的 DockPanel,我不想给每个复选框和每个 dockpanel 一个名字并编写数百个基本上做同样事情的事件处理程序。 有没有办法将该行为放入样式或模板中? C
为什么要使用单独的标签来选中和取消选中复选框?
Use this Alternative solution
<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>
您实际上不必为每个停靠面板命名它们或事件处理程序。
您可以对所有这些停靠面板使用相同的事件处理程序,并且在您的事件处理程序中,您可以使用发件人而不是姓名。
<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");
}