有一个导航命令,需要在点击时显示工具提示,同时禁用,以便用户知道它被禁用的原因。我遇到的问题是我不知道如何将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));
});
}
}
如果有人能指出我正确的方向,我们将不胜感激。
答案 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();
}
来自以下位置的计时器。
这样可以禁用该按钮,并且工具提示仍会在单击时显示。我现在需要做的就是将工具提示内容包装在一个绑定中,并在悬停时禁用工具提示(不是必需的),这一切都已解决。
暂时提出问题,因为更好的解决方案可能会出现。