Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 禁用按钮时单击按钮的工具提示_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# 禁用按钮时单击按钮的工具提示

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

具有一个导航命令,该命令在禁用时需要在单击时显示工具提示,以便用户知道禁用该命令的原因。我遇到的问题是,我不知道如何将触地事件从xaml文件传递到viewmodel。是否有某种方法可以绑定它,而不是在command.xaml.cs中创建事件

命令的结构如下所示。我有一个CommandButton.xaml和CommandButton.xaml.cs,而设置按钮的所有内容都由VM(文本、图像、执行的命令等)代码处理,如下例所示

<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();
    }