WPF的菜单Disable了还能被点击?

梁苏彬 2008-12-18 03:55:02
怀疑这是不是一个bug,浪费了我2天的时间才查出来。把MenuItem.IsEnabled=False后,还能点击进这个菜单。下面的代码,第一次点击菜单把自己disable了,可是还能继续点进去。经过调查发现是样式的问题,样式里ContentPresenter外面包的TextBlock去掉或者换成StackPanel,Border都没问题。有谁能说明是为什么吗?

XAML代码:
<Window x:Class="sandbox.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" >
<Window.Resources>
<ControlTemplate x:Key="MenuItemTemplate" TargetType="{x:Type MenuItem}">
<TextBlock>
<ContentPresenter ContentSource="Header"/>
</TextBlock>
<!--The following is correct-->
<!--<StackPanel>
<ContentPresenter ContentSource="Header"/>
</StackPanel>-->
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="Gray"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Window.Resources>
<Menu>
<MenuItem Name="miFile" Header="File" Click="miFile_Click" Template="{StaticResource MenuItemTemplate}"/>
</Menu>
</Window>

C#代码:
private void miFile_Click(object sender, RoutedEventArgs e)
{
miFile.IsEnabled = false;
System.Windows.MessageBox.Show("File clicked!");
}
...全文
274 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
梁苏彬 2008-12-26
  • 打赏
  • 举报
回复
楼上的解释非常完美,thanks a lot!

我在ContentPresenter外面嵌套TextBlock的原因是要设Foreground。无法直接设定ContentPresenter的Foreground,只好通过设定套在外面的Textblock的方法。现在改成套Label在外面,就完美解决了。
zhouyongh 2008-12-20
  • 打赏
  • 举报
回复
TextBlock继承于FrameworkElement,用于显示字体,是个基础控件。
往TextBlock内嵌ContentPresenter,似乎没什么意义。

如果你要使用这种字体内嵌,请使用Label,它继承于ContentControl,有自己的ControlTemplate。

控件IsEnabled后没有作用是因为TextBlock没有同步内部的Visual Child的IsEnabled,因为它认为不应该内部被内嵌。
然后你点击的时候,如果当前HitTest取得的区域属于ContentPresenter,那么他的IsEnabled就是True,所以Click被触发。

你可以这样设置
<TextBlock Text="TextBlock Region">
<ContentPresenter Width="20" ContentSource="Header"/>
</TextBlock>

<MenuItem Name="miFile" Width="140" Header="File" Click="miFile_Click" Template="{StaticResource MenuItemTemplate}"/>

点击设置IsEnabled后,点击“TextBlock Region”区域不会相应Click,点击“File”会。

Hope this helps
梁苏彬 2008-12-19
  • 打赏
  • 举报
回复
如果把IsHighlighted的trigger设置上画一个背景色,能看到disable的菜单也能被highlight
GTX280 2008-12-18
  • 打赏
  • 举报
回复
我的理解是点击事件只是触发了TextBlock的Click,MenuItem Disable后TextBlock仍然响应这个Click事件
我以前做过一个RadioButton的模板,上面放了一个Button,设置了Click事件。结果点击后执行了函数,但是RadioButton的IsChecked属性没有变化。应该和楼主的情况类似
guokea 2008-12-18
  • 打赏
  • 举报
回复
up
tianshangfei 2008-12-18
  • 打赏
  • 举报
回复
00

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧