按钮单击时工具提示按钮被禁用

时间:2016-12-12 15:38:18

标签: c# wpf xaml mvvm

有一个导航命令,需要在点击时显示工具提示,同时禁用,以便用户知道它被禁用的原因。我遇到的问题是我不知道如何将TouchDown事件从我的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>

对于后面的代码,我将基本命令类中的大部分处理程序内容拆分为如下所示。

public abstract class BaseCommand : BindableBase
{
    protected IModuleManager ModuleManager { get; set; }

    protected IRegionManager RegionManager { get; set; }

    protected BaseCommand(IRegionManager regionManager, IModuleManager moduleManager, string pageName = null)
    {
        RegionManager = regionManager;
        ModuleManager = moduleManager;
        Text = GetButtonText(pageName + "_BtnTxt");
        Image = (ImageSource)Application.Current.FindResource(pageName + "_BtnImg");
    }

    private string _text;

    private ImageSource _image;

    public ICommand CommandToExecute => new DelegateCommand<object>(Command, Evaluate);

    protected abstract void Command(object obj);

    protected virtual bool Evaluate(object obj)
    {
        return false;
    }

    public string Text
    {
        get { return _text; }
        set { SetProperty(ref _text, value); }
    }

    public ImageSource Image
    {
        get { return _image; }
        set { SetProperty(ref _image, value); }
    }

    protected string GetButtonText(string key)
    {
        string uiString;
        var locExtension = new LocTextExtension
        {
            Key = "Resources",
            ResourceIdentifierKey = key
        };
        locExtension.ResolveLocalizedValue(out uiString);
        return uiString;
    }
}

然后是viewmodel中的命令特定内容。

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

如果有人能指出我正确的方向,我们将不胜感激。

2 个答案:

答案 0 :(得分:0)

也许不是禁用按钮,而是将按钮重新指向其他方法,然后显示错误/工具提示消息。 (然后,您可以传入字符串,说明方法参数/变量中不活动的原因。)

我还建议您更改按钮的类/视觉属性,使其看起来已禁用。

答案 1 :(得分:0)

经过大量的谷歌搜索,我自己想出了一个解决方案,部分归功于其他人在正确的方向上引导我的评论。在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>

并在button.xaml.cs上放入事件来处理按钮点击等的时间。

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

来自以下位置的计时器。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/9e3eb4ab-ed0f-40ad-ad47-a1fff8e0fe8d/tooltips-in-wpf-touch-applications?forum=wpf

这样可以禁用该按钮,并且工具提示仍会在单击时显示。我现在需要做的就是将工具提示内容包装在一个绑定中,并在悬停时禁用工具提示(不是必需的),这一切都已解决。

暂时提出问题,因为更好的解决方案可能会出现。