C# 禁用按钮时单击按钮的工具提示
具有一个导航命令,该命令在禁用时需要在单击时显示工具提示,以便用户知道禁用该命令的原因。我遇到的问题是,我不知道如何将触地事件从xaml文件传递到viewmodel。是否有某种方法可以绑定它,而不是在command.xaml.cs中创建事件 命令的结构如下所示。我有一个CommandButton.xaml和CommandButton.xaml.cs,而设置按钮的所有内容都由VM(文本、图像、执行的命令等)代码处理,如下例所示C# 禁用按钮时单击按钮的工具提示,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,具有一个导航命令,该命令在禁用时需要在单击时显示工具提示,以便用户知道禁用该命令的原因。我遇到的问题是,我不知道如何将触地事件从xaml文件传递到viewmodel。是否有某种方法可以绑定它,而不是在command.xaml.cs中创建事件 命令的结构如下所示。我有一个CommandButton.xaml和CommandButton.xaml.cs,而设置按钮的所有内容都由VM(文本、图像、执行的命令等)代码处理,如下例所示 <Button Focusable="True" Name="B
<Button Focusable="True" Name="Btn1" Command="{Binding CommandToExecute}" Tag="{Binding Text}" Foreground="{x:Null}" Style="{DynamicResource ButtonStyle}" ToolTipService.ShowOnDisabled="true" TouchDown="Btn1_OnTouchDown" >
<Button.ToolTip>
<StackPanel>
<TextBlock>Test</TextBlock>
<TextBlock>Load stencil, or not your choice.</TextBlock>
</StackPanel>
</Button.ToolTip>
<shellModule:AutoGreyableImage Source="{Binding Image}" />
</Button>
如果有人能为我指出正确的方向,我将不胜感激。也许不必禁用按钮,而是将按钮重新指向另一种方法,这样会显示错误/工具提示消息。(然后可以传入字符串,说明方法参数/变量中不活动的原因。)
我还建议您更改按钮的类/视觉属性,使其看起来是禁用的。在谷歌搜索了很多次之后,我自己想出了一个解决方案,这在一定程度上要感谢其他人的评论将我引向了正确的方向。将我的按钮包装在contentControl中,并将工具提示应用于此
<ContentControl MouseDown="ContentControl_MouseDown">
<ContentControl.ToolTip>
<ToolTip Placement="Mouse" Content="Testing" />
</ContentControl.ToolTip>
<Button Focusable="True" x:Name="Btn1" Command="{Binding CommandToExecute}" Tag="{Binding Text}" Foreground="{x:Null}" Style="{DynamicResource ButtonStyle}" ToolTipService.ShowOnDisabled="true">
<shellModule:AutoGreyableImage Source="{Binding Image}" />
</Button>
</ContentControl>
从以下位置获取计时器
这允许禁用按钮,并且工具提示在单击时仍然显示。我现在需要做的就是将工具提示内容包装在一个绑定中,并禁用悬停时的工具提示(不是必需的),所有问题都解决了
然而,暂时将问题留待讨论,因为更好的解决方案可能会出现。单击时的工具提示很奇怪。为什么不将按钮包装在某个面板中,以显示工具提示?通过这种方式,即使按钮本身被禁用,它也将可见。应用程序将在触摸屏上运行,这就是为什么需要onclick而不是悬停。那么它不是真正的“单击”,是吗?工具提示在TouchUI中不是一个方便的解决方案。如果您真的需要以这种方式显示信息,为什么不完全停止禁用按钮,并在用户单击时根据某些条件显示一些消息呢?这取决于我们使用的触摸屏。我们在过去(可能是将来)使用的电阻式触摸屏不会将手指按压转换为触摸事件,而是转换为点击事件。或者至少看起来是这样。我认为它们只在电容式屏幕上记录为触摸事件(我可能错了)是的,我认为这是解决问题的一种潜在方法。我只是希望有一些方法可以在没有烟雾和镜子的情况下实现这一点,但这是我目前的应急计划(同事已经有了一个工作原型,可以以同样的方式工作。)是的,关于工具提示的位置/可行性有一个完整的争论。似乎有点奇怪,似乎没有一个标准,甚至没有一个共同的观点认为对它们有合理的需求。好吧,你的回答确实帮助我找到了一些有用的东西。现在,我将按钮包装在内容控件中,并将工具提示指定给内容控件。这样按钮可以被禁用,但内容控制仍然可以为我处理事件。再看看你链接的帖子,他们遗漏了一个大的部分,其中触摸屏和工具提示都是经常需要的。制造业(此应用程序的用途)。硬件位置不正确,设置不正确,许多影响控件显示的变量意味着工具提示非常必要。事实证明,这也不是一个理想的解决方案。无法获取用于绑定的工具提示。没有文本通过它,可能需要进一步研究。啊,直接在ContentControl上设置tooltip={Binding blah}效果很好,只有当它在ContentControl内时我才尝试绑定它。tooltip标记失败。仍然不知道有什么区别,但这对我来说是有效的。
public class Page1CommandViewModel : BaseCommand, IPage1CommandViewModel
{
public Page1CommandViewModel(IRegionManager regionManager, IModuleManager moduleManager) : base( regionManager, moduleManager, PageNames.Page1 )
{
}
protected override void Command(object obj)
{
Task.Run(() =>
{
ModuleManager.LoadModule(ModuleNames.Page1Module);
RegionManager.RequestNavigate(RegionNames.ContentRegion, new Uri(PageNames.Page1, UriKind.Relative));
});
}
}
<ContentControl MouseDown="ContentControl_MouseDown">
<ContentControl.ToolTip>
<ToolTip Placement="Mouse" Content="Testing" />
</ContentControl.ToolTip>
<Button Focusable="True" x:Name="Btn1" Command="{Binding CommandToExecute}" Tag="{Binding Text}" Foreground="{x:Null}" Style="{DynamicResource ButtonStyle}" ToolTipService.ShowOnDisabled="true">
<shellModule:AutoGreyableImage Source="{Binding Image}" />
</Button>
</ContentControl>
Timer Timer { get; set; }
ToolTip toolTip { get; set; }
public CommandButton()
{
InitializeComponent();
Timer = new Timer {Interval = 3000};
Timer.Elapsed += OnTimerElapsed;
}
private void CloseToolTip()
{
if (toolTip != null)
{
toolTip.IsOpen = false;
}
}
private void OnTimerElapsed(object sender, ElapsedEventArgs e)
{
Timer.Stop();
Application.Current.Dispatcher.BeginInvoke((Action)CloseToolTip, DispatcherPriority.Send);
}
private void ContentControl_MouseDown(object sender, MouseButtonEventArgs e)
{
toolTip = ((ToolTip)((Control)sender).ToolTip);
toolTip.IsOpen = true;
Timer.Start();
}