我正在拔出我的头发试图弄清楚为什么正常的Dispatcher.Invoke命令不能用于重绘我的窗口,但现在我的问题似乎与被禁用的内容有关。我正在使用Dotnet 4.0完整框架。
如果我使用
private void DoSomething()
{
HandleBusyEnableDisable(false);
DoSomethingThatKeepsItBusy();
HandleBusyEnableDisable(true);
}
private void HandleBusyEnableDisable(bool enabling)
{
Cursor = enabling ? Cursors.Arrow : Cursors.Wait;
CanvasFunctions.IsEnabled = enabling;
CanvasRight.IsEnabled = enabling;
CanvasRight.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render, EmptyDelegate);
我看到光标发生了变化,但内容看起来没有被禁用。如果我添加
CanvasRight.Opacity = enabling ? 1 : .5;
然后我认为它有效。还有别的我可以做的吗? 正在运行的任务是验证用户输入的数据,因此更容易在GUI线程上运行。这不应该那么难。
答案 0 :(得分:1)
并非所有控件都在视觉上表示被禁用,您可能会注意到它们无法从客户端使用。
坦率地说,您应该只实现INotifyChanged并将启用字段绑定到属性。这将确保控件正确启用/禁用,因为绑定框架将执行正确的调度IsEnabled
我相信已在AffectsRender
注册,这将使控件的视觉状态无效并强制重新绘制。< / p>
此外,您应该使用样式来调整控件的可视状态:
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.5" />
</DataTrigger>
</Style.Triggers>
</Style>
答案 1 :(得分:0)
如果您正在UI线程上运行长时间运行的验证操作,那么您将锁定UI,并且在验证完成之前无法更新Visual。到那时你已经重新启用了控件。如果操作足够长,用户会注意到它应该在后台线程上完成。